>백엔드 개발 >C++ >원래 포인터가 기본 클래스 개체를 가리킬 때 파생 포인터에 대한 'static_cast'가 C의 전체 파생 개체에 액세스하는 것처럼 보이는 이유는 무엇입니까?

원래 포인터가 기본 클래스 개체를 가리킬 때 파생 포인터에 대한 'static_cast'가 C의 전체 파생 개체에 액세스하는 것처럼 보이는 이유는 무엇입니까?

DDD
DDD원래의
2024-11-26 15:20:10346검색

Why Does `static_cast` to a Derived Pointer Seem to Access the Entire Derived Object in C   When the Original Pointer Points to a Base Class Object?

C에서 정적 형변환을 사용한 다운캐스팅

C에서 다운캐스팅은 기본 클래스 포인터 또는 참조를 파생 클래스 포인터 또는 참조로 변환하는 것을 의미합니다. 다운캐스팅을 수행하는 한 가지 방법은 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();
}

이 예에는 기본 클래스와 파생 클래스가 있습니다. base 유형의 객체를 가리키는 기본 클래스 포인터 b를 만듭니다. static_cast<>를 사용하여 b를 파생 클래스 포인터 d로 캐스팅하려고 합니다.

여기서 혼란스러운 질문은 b가 기본을 가리키고 있음에도 불구하고 파생 클래스 포인터 d가 전체 파생 클래스 개체에 액세스할 수 있는 이유입니다. 클래스 객체입니다.

그러나 static_cast<> 속하지 않는 유형에 대한 포인터를 캐스팅하는 것은 C에서 정의되지 않은 동작으로 간주됩니다.

C 표준([expr.static.cast])에 따르면 정적 기본 클래스 포인터에서 파생 클래스 포인터로의 캐스팅은 다음 조건이 충족되는 경우에만 허용됩니다.

  1. "포인터에서 다음으로의 유효한 표준 변환이 있습니다. D"를 "B에 대한 포인터"로 변경합니다(여기서 D는 파생 클래스이고 B는 기본 클래스입니다).
  2. B는 D의 가상 기본 클래스 또는 D의 가상 기본 클래스의 기본 클래스가 아닙니다.
  3. 가리키는 기본 클래스 개체가 실제로 파생 클래스 개체의 하위 개체인 경우 결과 포인터는 둘러싸는 파생 클래스를 가리켜야 합니다. object.

이러한 조건 중 하나라도 충족되지 않으면 캐스트 결과가 정의되지 않습니다.

주어진 코드에서 b는 순수 기본 클래스 객체를 가리키므로 가리키는 파생 클래스 객체를 둘러싸는 것이 아닙니다. 따라서 프로그램의 동작은 예측할 수 없게 되므로 이에 의존해서는 안 됩니다.

위 내용은 원래 포인터가 기본 클래스 개체를 가리킬 때 파생 포인터에 대한 'static_cast'가 C의 전체 파생 개체에 액세스하는 것처럼 보이는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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