一部のコンテキストで、仮想ベース 'base_class' から 'derived_class' への変換が失敗する可能性がある
注釈
既定では、この警告はオフに設定されています。 詳細については、「 Compiler Warnings That Are Off by Default」を参照してください。
dynamic_cast操作は、次の場合に使用されます。
- キャストは、派生クラス ポインターへの基底クラス ポインターから取得されます。
- 派生クラスは、基底クラスを仮想的に継承します。
- 派生クラスには、仮想ベースの
vtordispフィールドがありません。 - 派生クラスのコンストラクターまたはデストラクター、あるいは派生クラスを継承するクラスの中にキャストが見つかります。 それ以外の場合、 C4435 のコンパイラ警告 C4436 が出力されます。
この警告は、部分的に構築されたオブジェクトに適用すると、 dynamic_cast が正しく動作しない可能性があることを示します。 この状況は、外側の関数が、 derived_classから継承するクラスのコンストラクターまたはデストラクターから呼び出されたときに発生します。
derived_classがそれ以上派生しない場合、またはオブジェクトの構築または破棄中に外側の関数が呼び出されない場合は、エラーを無視できます。
例
次の例では 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;
}