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

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

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

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

sobes.tech AI

В C++ существуют разные виды приведения типов, каждый из которых служит своей цели:

  • static_cast — используется для явного преобразования типов, которое проверяется на этапе компиляции. Подходит для преобразования между совместимыми типами, например, из int в float или из базового класса в производный (без проверки во время выполнения).

  • dynamic_cast — применяется для безопасного приведения указателей или ссылок в иерархии наследования. Работает только с полиморфными типами (с виртуальными методами). При неудаче возвращает nullptr (для указателей) или выбрасывает исключение (для ссылок). Используется для проверки типа во время выполнения.

  • reinterpret_cast — самый "жёсткий" и небезопасный вид приведения, который просто интерпретирует битовое представление объекта как другой тип. Используется для низкоуровневых операций, например, преобразования указателя в целочисленный тип и обратно. Требует осторожности, так как может привести к неопределённому поведению.

Пример:

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

Base* b = new Derived();

// static_cast: без проверки во время выполнения
Derived* d1 = static_cast<Derived*>(b);

// dynamic_cast: с проверкой во время выполнения
Derived* d2 = dynamic_cast<Derived*>(b);

// reinterpret_cast: просто меняет интерпретацию указателя
intptr_t ptr_val = reinterpret_cast<intptr_t>(b);