dynamic_castコンストラクターまたはデストラクター内で、仮想ベース 'base_class' から 'derived_class' への変換は、部分的に構築されたオブジェクトで失敗する可能性があります。
注釈
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); // asserts unless compiled with /vd2
}
};
#if defined(FIX)
#pragma vtordisp(pop)
#endif
struct C : B
{
int i;
};
int main()
{
C c;
}