Compilerwarnung (Ebene 4) C4437

dynamic_cast von der virtuellen Basis "Klasse1" bis "Klasse2" könnte in einigen Kontexten kompiliert mit /vd2 fehlschlagen oder 'class2' definieren, wobei #pragma vtordisp(2) wirksam ist.

Diese Warnung ist standardmäßig deaktiviert. Weitere Informationen finden Sie unter Standardmäßig deaktivierte Compilerwarnungen .

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 nicht in einem Konstruktor oder Destruktor der abgeleiteten Klasse oder einer Klasse, die weiter von der abgeleiteten Klasse erbt (andernfalls wird die Compilerwarnung C4436 ausgegeben).

Die Warnung weist darauf hin, dass die dynamic_cast Funktion möglicherweise nicht ordnungsgemäß ausgeführt wird, wenn sie auf einem teilweise konstruierten Objekt ausgeführt wird. Diese Situation tritt auf, wenn die eingeschlossene Funktion von einem Konstruktor oder Destruktor einer Klasse aufgerufen wird, die die abgeleitete Klasse erbt, die in der Warnung benannt ist. Wenn die abgeleitete Klasse, die in der Warnung benannt ist, nie weiter abgeleitet wird oder die Umschließfunktion während der Objektkonstruktion oder -zerstörung nicht aufgerufen wird, kann die Warnung ignoriert werden.

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