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_castvon der virtuellen Basis "base_class" zu "derived_class" kann im Konstruktor oder Destruktor mit teilweise konstruiertem Objekt fehlschlagen.
Bemerkungen
Ein dynamic_cast Vorgang wird verwendet, wenn:
- 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
vtordispFeld für die virtuelle Basis. - Die Umwandlung befindet sich in einem Konstruktor oder Destruktor der abgeleiteten Klasse oder einer Klasse, die von der abgeleiteten Klasse erbt.
Diese Warnung weist darauf hin, dass das dynamic_cast Objekt möglicherweise nicht ordnungsgemäß ausgeführt wird, wenn es auf ein teilweise konstruiertes Objekt angewendet 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, nicht weiter abgeleitet wird, können Sie die Warnung ignorieren.
Beispiel
Im folgenden Beispiel wird C4436 generiert und das Problem der Codegenerierung aufgrund des fehlenden vtordisp Felds veranschaulicht:
// 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); // asserts 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 1 und Ebene 4, deaktiviert) C4437