다음을 통해 공유


dynamic_cast의 주요 변경 사항

업데이트: 2007년 11월

Microsoft Visual C++ 2005 및 Visual C++ .NET 2002에서는 응용 프로그램의 동작이 변경될 수 있도록 dynamic_cast 연산자가 변경되었습니다.

  • 표준에 컴파일 타임 검사가 필요한 경우 Visual C++ 6.0 컴파일러는 런타임 검사를 허용했습니다. Visual C++ .NET 2002(Visual C++ 7.0)에서는 이 문제가 해결되었습니다.

  • C 런타임 라이브러리는 이제 dynamic_cast 런타임 검사를 수행하여 캐스팅되는 식의 컴파일 타임 형식이 캐스트 대상 형식(다운캐스팅의 경우) 또는 최대 파생 개체 형식(크로스캐스팅의 경우) 중 하나의 공용 기본 클래스 하위 개체를 참조하도록 합니다.

컴파일러 변경 사항에 대한 자세한 내용은 Visual C++ 컴파일러의 주요 변경 사항을 참조하십시오.

예제

설명

이 코드 샘플에서 변수 pA2는 VC6에서 NULL입니다. 컴파일러는 ISO C++ 표준의 5.2.7/3에 지정된 대로 ID 검사를 수행하지 않았습니다. 그러나 이 캐스팅은 Visual C++ .NET 2002(Visual C++ 7.0)부터 성공적으로 수행됩니다.

따라서 이로 인해 Visual C++ 6.0에서는 예외가 throw되었지만 이제 예외가 throw되지 않습니다.

코드

// dynamic_cast_breaking_change.cpp
struct A { 
   virtual void F() {}
};

struct B { 
   virtual void F() {}
};

void Test(A* pA) {
   A* pA2 = dynamic_cast<A*>(pA);
   A& rA = dynamic_cast<A&>(*pA);
}

int main() {
   B* pB = new B;
   Test(reinterpret_cast<A*>(pB));
}

예제

설명

이 샘플에서는 C 런타임 라이브러리가 이제 dynamic_cast 런타임 검사를 수행하여 캐스팅되는 식의 컴파일 타임 형식이 캐스트 대상 형식(다운캐스팅의 경우) 또는 최대 파생 개체 형식(크로스캐스팅의 경우) 중 하나의 공용 기본 클래스 하위 개체를 참조하도록 하는 것을 보여 줍니다.

이전 Visual C++ 릴리스에서는 이러한 동적 캐스팅이 성공했습니다.

코드

// dynamic_cast_breaking_change_2.cpp
#include "stdio.h"

struct A { 
   virtual void Test() {}
};

struct B : virtual private A {
   virtual void Test() {}
};

struct D : virtual private A {
   virtual void Test() {}
};

struct C : public B, public D {
   virtual void Test() {}
};

int main() {
   C c;
   printf("%p\n", dynamic_cast<B*>((A*)&c) );
   printf("%p\n", dynamic_cast<C*>((A*)&c) );
}

샘플 출력

00000000
00000000

예제

설명

이 샘플에서는 캐스팅의 소스와 대상 간 하위 개체가 공용이 아닌 경우 dynamic_cast 캐스팅이 실패함을 보여 줍니다.

코드

// dynamic_cast_breaking_change_3.cpp
#include "stdio.h"
struct A { 
   virtual void Test() {}
};

struct B : virtual public A {
   virtual void Test() {}
};

struct C : virtual private B {
   virtual void Test() {}
};

int main() {
   C c;
   printf("%p\n", dynamic_cast<B*>((A*)&c) );
   printf("%p\n", dynamic_cast<C*>((A*)&c) );
}

샘플 출력

0012FF70
00000000

참고 항목

참조

dynamic_cast Operator