Back to questions
Junior — Middle
87
Какое отличие между static_cast и dynamic_cast в C++ и в каких случаях их следует применять?
Companies where asked
ГК Адепт
Answer from AI
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