Избегайте использования dynamic_cast

std::dynamic_cast<> это дорого. В случаях, когда не используется множественное наследование, используйте, если это возможно, std::static_cast<> вниз по иерархии наследования (от родителя к потомку). Если невозможно (тип потомка не гарантирован), то рассмотрите вариант с дополнительным полем в базовом классе типа enum, который будет сообщать тип экземпляра. Для приведения к родителю std::dynamic_cast не нужен. Более того, не нужен и std::static_cast. В большинстве случаев, компилятор способен выявлять ошибочное применение std::dynamic_cast и оптимизирует заменой на std::static_cast, однако полагаться на ум и смекалку компилятора не следует.

Важно!!! Не используйте std::dynamic_cast при работе с указателями на COM-интерфейсы. Никогда!!! COM-объекты могут быть реализованы на другом языке программирования, могут использовать агрегирование и т.д. В этом случае std::dynamic_cast приведет к проблемам вплоть до аварийного завершения программы.