Dela via


Kompilatorvarning (nivå 1 och nivå 4, av) C4437

dynamic_cast från den virtuella basen "base_class" till "derived_class" kan misslyckas i vissa sammanhang

Anmärkningar

Den här varningen är inaktiverad som standard. Mer information finns i Kompilatorvarningar som är inaktiverade som standard.

En dynamic_cast åtgärd används när:

  • Typomvandlingen är från en basklasspekare till en härledd klasspekare.
  • Den härledda klassen ärver praktiskt taget basklassen.
  • Den härledda klassen har vtordisp inget fält för den virtuella basen.
  • Typomvandlingen finns i en konstruktor eller destruktor av subklassen, eller en klass som ärver från subklassen. Annars skickas kompilatorvarning C4436 ut från C4435.

Den här varningen anger att kanske inte fungerar korrekt när det används på ett delvis konstruerat objekt. Den här situationen uppstår när den omslutande funktionen anropas från en konstruktor eller destruktor för en klass som ärver från derived_class. Du kan ignorera felet om derived_class aldrig längre härleds, eller om omslutande funktionen inte anropas under objektkonstruktion eller förstörelse.

Example

Följande exempel genererar C4437 och visar det problem med kodgenerering som uppstår från det saknade vtordisp fältet:

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

Se även

dynamic_cast Operatör
vtordisp
Kompilatorvarning (nivå 1) C4436