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