コンパイラの警告 (レベル 1) C4436
仮想基本 " class1 " から " コンストラクターまたはデストラクター " class2 " への dynamic_cast は、/vd2 の部分構築されたオブジェクトのコンパイルと仮想失敗するか、または " と " class2 " を、#pragma vtordisp (2) を定義できます
コンパイラは、次の特性を dynamic_cast 操作が発生しました。
キャストは基本クラスから派生クラスのポインターのポインターです。
派生クラスは、仮想基本クラスを継承します。
派生クラスに仮想基本の vtordisp のフィールドがありません。
キャストは派生クラス コンストラクターまたはデストラクター、または派生クラスからさらに継承するクラスにあります。
警告は、部分的構築されたオブジェクトで動作する dynamic_cast が正しく実行できないことを示します。派生コンストラクター/デストラクターが、さらに派生オブジェクトのサブオブジェクトで動作すると発生します。警告いう派生クラスでは以降の派生した、警告は無視できます。
使用例
次の例では C4436 を生成し、vtordisp が欠落しているフィールドから発生したコード生成問題を示します。
// C4436.cpp
// To see the warning and runtime assert, compile with: /W1
// To eliminate the warning and assert, compile with: /W1 /vd2
// or compile with: /W1 /DFIX
#include <cassert>
struct A
{
public:
virtual ~A() {}
};
#if defined(FIX)
#pragma vtordisp(push, 2)
#endif
struct B : virtual A
{
B()
{
A* a = static_cast<A*>(this);
B* b = dynamic_cast<B*>(a); // C4436
assert(this == b); // assert unless compiled with /vd2
}
};
#if defined(FIX)
#pragma vtordisp(pop)
#endif
struct C : B
{
int i;
};
int main()
{
C c;
}