Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
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;
}