versiones dev compiler c++ c++11

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:

can not dynamic_cast ''a'' (del tipo ''struct A *'') para escribir ''struct B *'' (el tipo de fuente no es polimórfico)

¿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() {} };