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