Upozornění kompilátoru (úroveň 4) C4437
dynamic_cast z virtuální základní třídy class1 do třídy 2 může v některých kontextech selhat v některých kontextech zkompilovat pomocí /vd2 nebo definovat třídu 2 s #pragma vtordisp(2).
Toto upozornění je ve výchozím nastavení vypnuté. Další informace najdete v tématu Upozornění kompilátoru, která jsou ve výchozím nastavení vypnutá.
Kompilátor zjistil dynamic_cast
operaci s následujícími vlastnostmi.
Přetypování je od ukazatele základní třídy na odvozený ukazatel třídy.
Odvozená třída prakticky dědí základní třídu.
Odvozená třída nemá
vtordisp
pole pro virtuální základ.Přetypování není nalezeno v konstruktoru nebo destruktoru odvozené třídy nebo některé třídy, které dále dědí z odvozené třídy (jinak bude vydáno upozornění kompilátoru C4436).
Upozornění značí, že dynamic_cast
se nemusí správně provádět, pokud pracuje na částečně vytvořeném objektu. K této situaci dochází v případě, že ohraničující funkce je volána z konstruktoru nebo destruktoru třídy, která dědí odvozenou třídu, která je pojmenována v upozornění. Pokud odvozená třída, která je pojmenována v upozornění není nikdy dále odvozena nebo uzavřená funkce není volána během vytváření nebo zničení objektu, lze upozornění ignorovat.
Příklad
Následující ukázka vygeneruje C4437 a demonstruje problém s generováním kódu, který vzniká z chybějícího vtordisp
pole.
// 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;
}
Viz také
dynamic_cast – operátor
vtordisp
Upozornění kompilátoru (úroveň 1) C4436