Ответ
dynamic_cast — это оператор безопасного приведения типов вниз или поперёк иерархии наследования, который выполняет проверку корректности приведения во время выполнения (Runtime Type Information, RTTI).
Особенности и правила:
- Работает только с полиморфными типами — классами, имеющими хотя бы одну виртуальную функцию.
- При работе с указателями: в случае неудачи возвращает
nullptr. - При работе с ссылками: в случае неудачи генерирует исключение
std::bad_cast. - Требует включённой поддержки RTTI (обычно включена по умолчанию).
Пример использования с указателями:
class Base {
public:
virtual ~Base() {} // Виртуальный деструктор делает класс полиморфным
};
class Derived : public Base {
public:
void specificMethod() { std::cout << "Derived methodn"; }
};
int main() {
Base* basePtr = new Derived;
// Безопасная попытка приведения
Derived* derivedPtr = dynamic_cast<Derived*>(basePtr);
if (derivedPtr) { // Проверка успешности
derivedPtr->specificMethod(); // Безопасный вызов
} else {
std::cout << "Cast failedn";
}
Base* trulyBasePtr = new Base;
Derived* failedCast = dynamic_cast<Derived*>(trulyBasePtr);
// failedCast будет равен nullptr
delete basePtr;
delete trulyBasePtr;
return 0;
}
Когда использовать:
- Когда необходима безопасная проверка типа объекта во время выполнения.
- В сложных иерархиях с множественным наследованием.
- Для реализации паттернов, подобных Visitor.
Альтернативы: Часто предпочтительнее проектировать код так, чтобы избегать dynamic_cast через использование виртуальных функций (полиморфизм).