Compilerwarnung (Ebene 1) C4436

dynamic_cast von der virtuellen Basis 'Class1' in 'Class2' im Konstruktor oder Destruktor konnte mit teilweise konstruierter Objektkompilierung mit /vd2 fehlschlagen oder 'class2' definieren, wobei #pragma vtordisp(2) wirksam ist.

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 in einem Konstruktor oder Destruktor der abgeleiteten Klasse oder einer Klasse, die weiter von der abgeleiteten Klasse erbt.

Die Warnung gibt an, dass die dynamic_cast Funktion möglicherweise nicht ordnungsgemäß ausgeführt wird, wenn sie auf einem teilweise konstruierten Objekt ausgeführt 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, nie weiter abgeleitet wird, kann die Warnung ignoriert werden.

Beispiel

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

// 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;
}

Siehe auch

dynamic_cast-Operator
vtordisp
Compilerwarnung (Ebene 4) C4437