Advertencia del compilador (nivel 4) C4437
dynamic_cast de la base virtual 'class1' a 'class2' podría producir un error en algunos contextos Compile con /vd2 o defina 'class2' con #pragma vtordisp(2)
De forma predeterminada, esta advertencia está desactivada. Vea Advertencias del compilador desactivadas de forma predeterminada para más información.
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 no se encuentra en un constructor o destructor de la clase derivada, o de alguna clase que además herede de la clase derivada (de lo contrario, se emitirá la advertencia del compilador C4436).
La advertencia indica que dynamic_cast
podría no funcionar correctamente si funciona en un objeto construido parcialmente. Esta situación se produce cuando se llama a la función envolvente desde un constructor o destructor de una clase que hereda la clase derivada que se nombra en la advertencia. Si la clase derivada que se nombra en la advertencia no se deriva nunca más o no se llama a la función envolvente durante la construcción o destrucción del objeto, la advertencia puede ser ignorada.
Ejemplo
El ejemplo siguiente genera la advertencia C4437 y muestra el problema de generación de código que surge del campo vtordisp
que falta.
// 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;
}
Consulte también
dynamic_cast (Operador)
vtordisp
Advertencia del compilador (nivel 1) C4436