static_cast 연산자를 사용한 다운캐스팅: 정의되지 않은 동작 설명
다음 사항을 고려하세요.
class base { base(); virtual void func(); }; class derived : public base { derived(); void func(); void func_d(); int a; }; int main() { base *b = new base(); sizeof(*b); // Gives 4. derived *d = static_cast<derived*>(b); sizeof(*d); // Gives 8 - means whole derived obj size...why? d->func_d(); }
이 시나리오에서는 , static_cast를 사용하여 기본 포인터를 파생 포인터로 캐스팅하면 전체에 대한 액세스가 허용되는 것처럼 보입니다. 파생 개체의 크기와 기능. 그러나 이로 인해 질문이 제기됩니다. 기본 포인터가 원래 고유한 기본 개체를 가리키는 경우 이것이 어떻게 가능합니까?
정의되지 않은 동작 이해
답은 다음과 같습니다. static_cast의 특성과 동적 객체에 미치는 영향. static_cast를 사용하여 객체에 실제로 없는 유형으로 다운캐스팅하는 것은 정의되지 않은 동작으로 분류됩니다. 이 경우 파생 클래스 멤버 함수 func_d()에 대한 예기치 않은 액세스를 허용하는 것을 포함하여 정의되지 않은 동작의 결과는 매우 다양할 수 있습니다.
다운캐스팅 규칙
에 따르면 C 표준(섹션 5.2.9)에서 static_cast를 사용한 다운캐스팅은 특정 규칙을 따릅니다. 규칙:
저희에서는 예:
d->func_d() 호출의 예상치 못한 성공은 정의되지 않은 동작의 결과입니다. 안전하지 않은 다운캐스트 후에 파생 클래스 멤버에 액세스하는 기능에 의존하지 마세요.
위 내용은 기본 포인터를 고유한 기본 개체로 다운캐스팅할 때 `static_cast`가 어떻게 겉보기에 파생 클래스의 멤버에 대한 액세스를 허용할 수 있습니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!