РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
730 of 815 menu

Оператор dynamic_cast

Оператор dynamic_cast выполняет преобразование типов с проверкой во время выполнения программы. Он применяется для приведения указателей и ссылок внутри иерархии наследования. Если преобразование невозможно, для указателей возвращается нулевой указатель, а для ссылок выбрасывается исключение std::bad_cast.

В угловых скобках указывается целевой тип, а в круглых скобках - исходное выражение. Оператор dynamic_cast работает только с полиморфными типами, то есть с классами, у которых есть хотя бы одна виртуальная функция.

Синтаксис

dynamic_cast<target_type>(expression)

Пример

Давайте приведём указатель базового класса к указателю производного класса:

#include <iostream> using namespace std; class Base { public: virtual void show() { cout << "Base" << endl; } }; class Derived : public Base { public: void show() override { cout << "Derived" << endl; } }; int main() { Base* base = new Derived; Derived* derived = dynamic_cast<Derived*>(base); if (derived) { derived->show(); } delete base; return 0; }

Результат выполнения кода:

"Derived"

Пример

Давайте попробуем выполнить некорректное приведение и проверим результат:

#include <iostream> using namespace std; class Base { public: virtual ~Base() {} }; class Derived : public Base { public: void hello() { cout << "Hello" << endl; } }; int main() { Base* base = new Base; Derived* derived = dynamic_cast<Derived*>(base); if (derived) { derived->hello(); } else { cout << "Cast failed" << endl; } delete base; return 0; }

Результат выполнения кода:

"Cast failed"

Пример

Давайте выполним приведение ссылки и обработаем исключение:

#include <iostream> #include <typeinfo> using namespace std; class Base { public: virtual ~Base() {} }; class Derived : public Base { public: void show() { cout << "Derived" << endl; } }; int main() { Base base; try { Derived& derived = dynamic_cast<Derived&>(base); derived.show(); } catch (const bad_cast& e) { cout << "Bad cast" << endl; } return 0; }

Результат выполнения кода:

"Bad cast"

Смотрите также

  • оператор static_cast,
    который выполняет преобразование на этапе компиляции
  • оператор const_cast,
    который снимает или добавляет константность
  • оператор reinterpret_cast,
    который переинтерпретирует тип данных
  • приведение в стиле C c-cast,
    которое объединяет разные виды преобразований
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить