Dela via


Kompilatorvarning (nivå 1) C4436

dynamic_cast från den virtuella basen "base_class" till "derived_class" i konstruktorn eller destruktören kan misslyckas med delvis konstruerat objekt

Anmärkningar

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.

Den här varningen anger att den dynamic_cast kanske inte fungerar korrekt om den tillämpas på ett delvis konstruerat objekt. Vilket händer om den härledda konstruktorn/destruktorn verkar på ett delobjekt av ett vidare härlett objekt. Om den härledda klassen som nämns i varningen inte är ytterligare härledd kan du ignorera varningen.

Example

I följande exempel genereras C4436 och kodgenereringsproblemet visas på grund av att fältet saknas vtordisp :

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

Se även

dynamic_cast Operatör
vtordisp
Kompilatorvarning (nivå 1 och nivå 4, av) C4437