編譯器警告 (層級 4) C4437
在某些內容中,從虛擬基底 'class1' 到 'class2' 的dynamic_cast可能會失敗,或使用 #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;
}