Compilerwarnung (Stufe 1) C4436
dynamic_cast aus der virtuellen Basisklasse "Klasse1" in "Klasse2" im Konstruktor oder Destruktor konnte mit teilweis-erstelltem Objekt fehlgeschlagenen Kompilieren mit /vd2 oder definieren "Klasse2" mit #pragma vtordisp (2) wirksam
Der Compiler hat einen dynamic_cast Vorgang mit den folgenden Eigenschaften gefunden.
Die Umwandlung ist von einem Basisklassenzeiger zu einem Zeiger der abgeleiteten Klasse.
Die abgeleitete Klasse erbt virtuell die Basisklasse.
Die abgeleitete Klasse hat kein vtordisp Feld für die virtuelle Basis.
Die Umwandlung wird in einem Konstruktor oder einen Destruktor in der abgeleiteten Klasse oder in einigen Klasse gefunden, die weiter von der abgeleiteten Klasse erbt.
Die Warnung angibt dynamic_cast kann möglicherweise nicht ordnungsgemäß aus, auf einem teilweis-erstellten Objekt funktioniert.Das geschieht, wenn der abgeleitete Konstruktoren/Destruktoren auf einem Unterobjekt einige nachfolgend abgeleiteten Objekts funktioniert.Wenn die abgeleitete Klasse, die in der Warnung genannt wird, nie weitere abgeleitetes ist, kann die Warnung ignoriert werden.
Beispiel
Im folgenden Beispiel wird C4436 und zeigt das Codegenerierungsproblem, das aus dem fehlenden vtordisp Feld entsteht.
// 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;
}