No se resisten los errores de sintaxis, no se puede dynamic_cast
un tipo no polimórfico. static_cast
es el elenco que usaría en este caso, si sabe que, de hecho, es un objeto del tipo de destino.
La razón por la cual: static_cast
básicamente hace que el compilador realice una comprobación en el momento de la compilación "¿Se podría enviar la entrada a la salida?" Esto se puede usar para los casos en los que está lanzando hacia arriba o hacia abajo una jerarquía de herencia de punteros (o referencias). Pero la verificación es solo en tiempo de compilación, y el compilador supone que usted sabe lo que está haciendo.
dynamic_cast
solo se puede utilizar en el caso de un puntero o modelo de referencia, y además de la verificación de tiempo de compilación, se hace un tiempo de ejecución adicional para verificar que el lanzamiento sea legal. Requiere que la clase en cuestión tenga al menos 1 método virtual, que permite al compilador (si es compatible con RTTI) realizar esta comprobación adicional. Sin embargo, si el tipo en cuestión no tiene ningún método virtual, entonces no se puede usar.
El caso más simple, y probablemente valga la pena si está aprobando punteros como este, es considerar la posibilidad de hacer virtual el destructor de la clase base. Además de permitirle usar el molde dinámico, también permite llamar a los destructores apropiados cuando se elimina un puntero de clase base.
'a' no es un puntero. ¿Es así como está en tu código? – littleadv
Lo siento, a es de hecho un puntero. – wbarksdale
¿Y es el tiempo de compilación de error o el tiempo de ejecución? Si el tiempo de ejecución, en mi humilde opinión es el comportamiento esperado. – littleadv