Upozornění kompilátoru (úroveň 1) C4436
dynamic_cast z virtuální základní třídy class1 do třídy 2 v konstruktoru nebo destruktoru může selhat s částečně sestaveným objektem Compile with /vd2 nebo definovat třídu 2 s #pragma vtordisp(2).
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í se nachází v konstruktoru nebo destruktoru odvozené třídy nebo v některé třídě, která dále dědí z odvozené třídy.
Upozornění značí, že dynamic_cast
nemusí správně fungovat, pokud pracuje s částečně vytvořeným objektem. K tomu dochází v případě, že odvozený konstruktor/destruktor pracuje na dílčím objektu některého dalšího odvozeného objektu. Pokud odvozená třída pojmenovaná v upozornění není nikdy dále odvozena, lze upozornění ignorovat.
Příklad
Následující ukázka vygeneruje C4436 a demonstruje problém s generováním kódu, který vzniká z chybějícího vtordisp
pole.
// 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;
}
Viz také
dynamic_cast – operátor
vtordisp
Upozornění kompilátoru (úroveň 4) C4437