Compilerwarnung (Ebene 1) C4436
dynamic_cast von der virtuellen Basis 'Class1' in 'Class2' im Konstruktor oder Destruktor konnte mit teilweise konstruierter Objektkompilierung mit /vd2 fehlschlagen oder 'class2' definieren, wobei #pragma vtordisp(2) wirksam ist.
Der Compiler hat einen dynamic_cast
Vorgang mit den folgenden Merkmalen festgestellt.
Die Umwandlung erfolgt von einem Basisklassenzeiger auf einen abgeleiteten Klassenzeiger.
Die abgeleitete Klasse erbt praktisch die Basisklasse.
Die abgeleitete Klasse verfügt nicht über ein
vtordisp
Feld für die virtuelle Basis.Die Umwandlung befindet sich in einem Konstruktor oder Destruktor der abgeleiteten Klasse oder einer Klasse, die weiter von der abgeleiteten Klasse erbt.
Die Warnung gibt an, dass die dynamic_cast
Funktion möglicherweise nicht ordnungsgemäß ausgeführt wird, wenn sie auf einem teilweise konstruierten Objekt ausgeführt wird. Dies geschieht, wenn der abgeleitete Konstruktor/Destruktor für ein Unterobjekt eines anderen abgeleiteten Objekts verwendet wird. Wenn die abgeleitete Klasse, die in der Warnung benannt ist, nie weiter abgeleitet wird, kann die Warnung ignoriert werden.
Beispiel
Im folgenden Beispiel wird C4436 generiert und das Problem der Codegenerierung veranschaulicht, das sich aus dem fehlenden vtordisp
Feld ergibt.
// 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;
}
Siehe auch
dynamic_cast-Operator
vtordisp
Compilerwarnung (Ebene 4) C4437