Compartir por


Advertencia del compilador (nivel 1) C4436

es posible que se produzca un error de dynamic_cast de la clase virtual "class1" para "class2" en un constructor o destructor con objetos construidos parcialmente. Compílelo con /vd2 o defina "class2" con #pragma vtordisp(2) en vigor

El compilador ha encontrado una operación dynamic_cast con las características siguientes.

  • La conversión es de un puntero de clase base a un puntero de clase derivada.

  • La clase derivada hereda virtualmente la clase base.

  • La clase derivada no tiene un campo vtordisp para la base virtual.

  • La conversión se encuentra en un constructor o destructor de la clase derivada o alguna clase que además herede de la clase derivada.

La advertencia indica que dynamic_cast podría no funcionar correctamente si funciona en un objeto construido parcialmente. Esto sucede si el constructor o destructor derivado está funcionando en un subobjeto de algún objeto derivado adicional. Si la clase derivada que se nombra en la advertencia no se deriva nunca más, se puede omitir la advertencia.

Ejemplo

El ejemplo siguiente genera la advertencia C4436 y muestra el problema de generación de código que surge del campo vtordisp que falta.

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

Consulte también

dynamic_cast (Operador)
vtordisp
Advertencia del compilador (nivel 4) C4437