>백엔드 개발 >C++ >기본 포인터를 고유한 기본 개체로 다운캐스팅할 때 `static_cast`가 어떻게 겉보기에 파생 클래스의 멤버에 대한 액세스를 허용할 수 있습니까?

기본 포인터를 고유한 기본 개체로 다운캐스팅할 때 `static_cast`가 어떻게 겉보기에 파생 클래스의 멤버에 대한 액세스를 허용할 수 있습니까?

Linda Hamilton
Linda Hamilton원래의
2024-11-30 10:35:11311검색

How Can `static_cast` Seemingly Allow Access to a Derived Class's Members When Downcasting a Base Pointer to a Distinct Base Object?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.