c++ - dev - Cómo obtener "tipo de fuente no es polimórfico" cuando intenta utilizar dynamic_cast
c++17 (3)
struct A {};
struct B : A {};
int main()
{
A* a = new B();
B* b = dynamic_cast<B*>(a);
}
da:
¿Cómo puedo hacer A
polimórfico? Quiero lanzarlo con seguridad a B.
(Una forma es agregar una función virtual ficticia, pero ¿hay una forma mejor?)
Como dice tu compilador, tu tipo A
no es polimórfico. Debería agregarle una función virtual
. Por ejemplo, un destructor virtual
podría ser una buena opción :
struct A { virtual ~A() { } };
// ^^^^^^^ This makes A a polymorphic type
struct B : A {};
int main()
{
A* a = new B();
B* b = dynamic_cast<B*>(a); // Should work now
}
Debes crear A
polimórfico, lo que puedes hacer agregando un destructor virtual
o cualquier función virtual:
struct A {
virtual ~A() = default;
};
o, antes de C ++ 11,
struct A {
virtual ~A() {}
};
Tenga en cuenta que un tipo polimórfico debe tener un destructor virtual de todos modos, si tiene la intención de llamar de manera segura a eliminar en las instancias de un tipo derivado a través de un puntero a la base.
Necesita al menos una función virtual
, normalmente, si no hay otras adecuadas, el destructor:
struct A {
virtual ~A() {}
};