Teilen über


Compilerwarnung (Ebene 1 und Ebene 4, deaktiviert) C4437

dynamic_cast von der virtuellen Basisklasse "base_class" zu "derived_class" könnte in einigen Kontexten fehlschlagen

Bemerkungen

Diese Warnung ist standardmäßig deaktiviert. Weitere Informationen finden Sie unter Compiler Warnings That Are Off by Default.

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 vtordisp Feld für die virtuelle Basis.
  • Die Umwandlung befindet sich entweder im Konstruktor oder Destruktor der abgeleiteten Klasse oder in einer Klasse, die von dieser abgeleiteten Klasse erbt. Andernfalls wird die Compilerwarnung C4436 aus C4435 ausgegeben.

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. Diese Situation tritt auf, wenn die eingeschlossene Funktion von einem Konstruktor oder Destruktor einer Klasse aufgerufen wird, die von derived_class erbt. Sie können den Fehler ignorieren, wenn derived_class nie weiter abgeleitet wird oder die Umschließfunktion während der Objektkonstruktion oder Zerstörung nicht aufgerufen wird.

Beispiel

Im folgenden Beispiel wird C4437 generiert und das Problem der Codegenerierung veranschaulicht, das sich aus dem fehlenden vtordisp Feld ergibt:

// C4437.cpp
// To see the warning and runtime assert, compile with: /W4
// To eliminate the warning and assert, compile with: /W4 /vd2
//       or compile with: /W4 /DFIX
#pragma warning(default : 4437)
#include <cassert>

struct A
{
public:
    virtual ~A() {}
};

#if defined(FIX)
#pragma vtordisp(push, 2)
#endif
struct B : virtual A
{
    B()
    {
        func();
    }

    void func()
    {
        A* a = static_cast<A*>(this);
        B* b = dynamic_cast<B*>(a);     // C4437
        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 1) C4436