Teilen über


Compilerwarnung (Ebene 1) C4436

dynamic_cast von 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 vtordisp Feld 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