Preguntas frecuentes: ¿Por qué dynamic_cast solo funciona si una clase tiene al menos 1 método virtual?

Esto no se comstack en C ++:

class A { }; class B : public A { }; ... A *a = new B(); B *b = dynamic_cast(a); 

Debido a que dynamic_cast solo puede dynamic_cast tipos polimórficos, así dice el estándar.

Puede hacer que su clase sea polimórfica agregando un destructor virtual a la clase base. De hecho, probablemente deberías hacerlo de todos modos (Ver nota al pie). De lo contrario, si intenta eliminar un objeto B través de un puntero A , evocará un Comportamiento no definido .

 class A { public: virtual ~A() {}; }; 

et voila!

Nota

Hay excepciones a la “regla” sobre la necesidad de un destructor virtual en tipos polimórficos.
Una de esas excepciones es cuando se utiliza boost::shared_ptr como lo señala Steve Jessop en los comentarios a continuación. Para obtener más información acerca de cuándo necesita un destructor virtual, lea este artículo de Herb Sutter .

Como dijo el otro: el estándar lo dice.

Entonces, ¿por qué el estándar lo dice?

Porque si el tipo no es polimórfico, puede ser (o es? Pregunta para los gurús estándar) un tipo simple. Y para los tipos simples hay muchas suposiciones que provienen de la compatibilidad con versiones anteriores de C. Una de ellas es que el tipo solo consta de sus miembros, ya que el desarrollador declaró + bytes de alineación necesarios. Entonces no puede haber ningún campo adicional (oculto). Entonces no hay forma de almacenar en el espacio de memoria conservado por A la información que realmente es un B.

Esto solo es posible cuando es polimórfico ya que está permitido agregar cosas ocultas. (En la mayoría de las implementaciones, esto se hace a través del vtable).

De 5.2.7 (lanzamiento dynamic):

El resultado de la expresión dynamic_cast(v) es el resultado de convertir la expresión v en tipo T.

[… múltiples líneas que se refieren a otros casos …]

De lo contrario, v será un apuntador o un valor l de un tipo polimórfico (10.3).

Desde 10.3 (Funciones virtuales):

Una clase que declara o hereda una función virtual se denomina clase polimórfica.