Что такое dynamic_cast в C++?

«Что такое dynamic_cast в C++?» — вопрос из категории C++ Core, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

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 через использование виртуальных функций (полиморфизм).