dynamic_cast должен сделать свое дело
TYPE& dynamic_cast<TYPE&> (object);
TYPE* dynamic_cast<TYPE*> (object);
dynamic_cast
Ключевое слово бросает геодезическое от одного указателя или ссылочного типа к другому, выполняя проверку выполнения для обеспечения достоверности гипсе.
Если вы попытаетесь привести к указателю на тип, который не является типом фактического объекта, результатом приведения будет NULL. Если вы попытаетесь привести к ссылке на тип, который не является типом фактического объекта, приведение вызовет bad_cast
исключение.
Убедитесь, что в Базовом классе есть хотя бы одна виртуальная функция для работы dynamic_cast.
Википедия тема Информация о типе времени выполнения
RTTI доступен только для полиморфных классов, что означает, что у них есть хотя бы один виртуальный метод. На практике это не является ограничением, поскольку базовые классы должны иметь виртуальный деструктор, чтобы объекты производных классов могли выполнять надлежащую очистку, если они удалены из базового указателя.