Freigeben über


Compilerwarnung (Stufe 1) C4436

dynamic_cast aus der virtuellen Basisklasse "Klasse1" in "Klasse2" im Konstruktor oder Destruktor konnte mit teilweis-erstelltem Objekt fehlgeschlagenen Kompilieren mit /vd2 oder definieren "Klasse2" mit #pragma vtordisp (2) wirksam

Der Compiler hat einen dynamic_cast Vorgang mit den folgenden Eigenschaften gefunden.

  • Die Umwandlung ist von einem Basisklassenzeiger zu einem Zeiger der abgeleiteten Klasse.

  • Die abgeleitete Klasse erbt virtuell die Basisklasse.

  • Die abgeleitete Klasse hat kein vtordisp Feld für die virtuelle Basis.

  • Die Umwandlung wird in einem Konstruktor oder einen Destruktor in der abgeleiteten Klasse oder in einigen Klasse gefunden, die weiter von der abgeleiteten Klasse erbt.

Die Warnung angibt dynamic_cast kann möglicherweise nicht ordnungsgemäß aus, auf einem teilweis-erstellten Objekt funktioniert.Das geschieht, wenn der abgeleitete Konstruktoren/Destruktoren auf einem Unterobjekt einige nachfolgend abgeleiteten Objekts funktioniert.Wenn die abgeleitete Klasse, die in der Warnung genannt wird, nie weitere abgeleitetes ist, kann die Warnung ignoriert werden.

Beispiel

Im folgenden Beispiel wird C4436 und zeigt das Codegenerierungsproblem, das aus dem fehlenden vtordisp Feld entsteht.

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

Referenz

Operator dynamic_cast

vtordisp

Compilerwarnung (Stufe 4) C4437