컴파일러 경고(수준 4) C4437
가상 기본 'class1'에서 'class2'로의 dynamic_cast /vd2를 사용하여 컴파일하거나 #pragma vtordisp(2)가 적용된 'class2'를 정의하는 일부 컨텍스트에서 실패할 수 있습니다.
기본적으로 이 경고는 해제되어 있습니다. 자세한 내용은 기본적으로 해제되어 있는 컴파일러 경고 를 참조하세요.
컴파일러에서 다음과 같은 특성의 dynamic_cast
작업이 발견되었습니다.
캐스트는 기본 클래스 포인터에서 파생된 클래스 포인터의 방향으로 수행됩니다.
파생된 클래스는 기본 클래스를 상속합니다.
파생된 클래스에는 가상 기본에 대한
vtordisp
필드가 포함되지 않습니다.파생 클래스의 생성자 또는 소멸자 또는 파생 클래스에서 추가로 상속되는 일부 클래스에서 캐스트를 찾을 수 없습니다(그렇지 않으면 컴파일러 경고 C4436이 발급됨).
이 경고는 부분적으로 생성된 개체에서 작동하는 경우 제대로 수행되지 않을 수 있음을 나타냅니다 dynamic_cast
. 이 상황은 바깥쪽 함수가 경고에 명명된 파생 클래스를 상속하는 클래스의 생성자 또는 소멸자에서 호출될 때 발생합니다. 경고에 명명된 파생 클래스가 더 이상 파생되지 않거나 개체 생성 또는 소멸 중에 바깥쪽 함수가 호출되지 않으면 경고를 무시할 수 있습니다.
예시
다음 샘플에서는 C4437을 생성하고 누락된 vtordisp
필드에서 발생하는 코드 생성 문제를 보여 줍니다.
// C4437.cpp
// To see the warning and runtime assert, compile with: /W4
// To eliminate the warning and assert, compile with: /W4 /vd2
// or compile with: /W4 /DFIX
#pragma warning(default : 4437)
#include <cassert>
struct A
{
public:
virtual ~A() {}
};
#if defined(FIX)
#pragma vtordisp(push, 2)
#endif
struct B : virtual A
{
B()
{
func();
}
void func()
{
A* a = static_cast<A*>(this);
B* b = dynamic_cast<B*>(a); // C4437
assert(this == b); // assert unless compiled with /vd2
}
};
#if defined(FIX)
#pragma vtordisp(pop)
#endif
struct C : B
{
int i;
};
int main()
{
C c;
}