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])에 따르면 정적 기본 클래스 포인터에서 파생 클래스 포인터로의 캐스팅은 다음 조건이 충족되는 경우에만 허용됩니다.
이러한 조건 중 하나라도 충족되지 않으면 캐스트 결과가 정의되지 않습니다.
주어진 코드에서 b는 순수 기본 클래스 객체를 가리키므로 가리키는 파생 클래스 객체를 둘러싸는 것이 아닙니다. 따라서 프로그램의 동작은 예측할 수 없게 되므로 이에 의존해서는 안 됩니다.
위 내용은 원래 포인터가 기본 클래스 개체를 가리킬 때 파생 포인터에 대한 'static_cast'가 C의 전체 파생 개체에 액세스하는 것처럼 보이는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!