Sobes.tech
Назад к вопросам
Junior — Middle
86

Какое отличие между static_cast и dynamic_cast в C++ и в каких случаях их следует применять?

Компании, где спрашивали
ГК Адепт

Ответ от нейросети

sobes.tech AI

static_cast и dynamic_cast — это операторы приведения типов в C++, но они служат разным целям:

  • static_cast:

    • Выполняет приведение типов во время компиляции.
    • Не проверяет корректность приведения во время выполнения.
    • Используется для преобразования между совместимыми типами, например, базовый → производный (без проверки), числовые типы, указатели.
    • Быстрее, но небезопасен при приведении указателей в иерархии классов.
  • dynamic_cast:

    • Выполняет проверку типа во время выполнения (RTTI).
    • Используется для безопасного приведения указателей или ссылок в иерархии наследования.
    • При неудаче для указателей возвращает nullptr, для ссылок выбрасывает std::bad_cast.
    • Требует, чтобы базовый класс имел хотя бы одну виртуальную функцию.

Когда применять:

  • Используйте static_cast, когда вы уверены в типах и хотите максимальную производительность.
  • Используйте dynamic_cast, когда нужно безопасно проверить тип во время выполнения, например, при работе с полиморфизмом и неоднозначными иерархиями.

Пример:

class Base { virtual void foo() {} };
class Derived : public Base {};

Base* b = new Derived();

// Безопасное приведение с проверкой
Derived* d1 = dynamic_cast<Derived*>(b); // nullptr, если b не Derived

// Приведение без проверки
Derived* d2 = static_cast<Derived*>(b); // может привести к ошибкам, если b не Derived