コンパイラの警告 (レベル 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;
}