Dynamic_cast debería hacer el truco
TYPE& dynamic_cast<TYPE&> (object);
TYPE* dynamic_cast<TYPE*> (object);
La dynamic_castpalabra clave arroja un dato desde un puntero o tipo de referencia a otro, realizando una verificación de tiempo de ejecución para garantizar la validez del reparto.
Si intenta lanzar un puntero a un tipo que no es un tipo de objeto real, el resultado del lanzamiento será NULL. Si intentas lanzar para hacer referencia a un tipo que no es un tipo de objeto real, el lanzamiento arrojará una bad_castexcepción.
Asegúrese de que haya al menos una función virtual en la clase Base para hacer que dynamic_cast funcione.
Tema de Wikipedia Información de tipo de tiempo de ejecución
RTTI está disponible solo para clases que son polimórficas, lo que significa que tienen al menos un método virtual. En la práctica, esto no es una limitación porque las clases base deben tener un destructor virtual para permitir que los objetos de las clases derivadas realicen una limpieza adecuada si se eliminan de un puntero base.