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

Класс bad_cast

Класс bad_cast является частью стандартной библиотеки C++ и наследуется от класса exception. Это исключение выбрасывается оператором dynamic_cast, когда приведение типа ссылки завершается неудачей. В отличие от приведения указателей, где в случае ошибки возвращается нулевой указатель, для ссылок не существует "нулевого" значения, поэтому стандарт предусматривает выброс исключения. Класс не имеет публичных конструкторов, кроме конструктора по умолчанию, и не содержит дополнительных методов, кроме унаследованного метода what.

Синтаксис

#include <typeinfo> class bad_cast : public exception { public: bad_cast() noexcept; virtual const char* what() const noexcept override; };

Пример

Рассмотрим пример, в котором выполняется попытка привести ссылку на базовый класс к ссылке на производный класс, не связанный с исходным объектом. Это приводит к выбросу исключения bad_cast, которое мы перехватываем и выводим сообщение:

#include <iostream> #include <typeinfo> using namespace std; class Base { public: virtual ~Base() {} }; class Derived : public Base {}; class Other : public Base {}; int main() { Derived d; Base& baseRef = d; try { Other& otherRef = dynamic_cast<Other&>(baseRef); cout << "Cast successful" << endl; } catch (const bad_cast& e) { cout << "bad_cast caught: " << e.what() << endl; } return 0; }

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

"bad_cast caught: std::bad_cast"

Пример

В следующем примере приведение выполняется успешно, так как объект действительно является экземпляром производного класса. Исключение не выбрасывается:

#include <iostream> #include <typeinfo> using namespace std; class Base { public: virtual ~Base() {} }; class Derived : public Base { public: void hello() { cout << "Hello from Derived" << endl; } }; int main() { Derived d; Base& baseRef = d; try { Derived& derivedRef = dynamic_cast<Derived&>(baseRef); derivedRef.hello(); } catch (const bad_cast& e) { cout << "bad_cast caught: " << e.what() << endl; } return 0; }

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

"Hello from Derived"

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

  • оператор throw,
    который выбрасывает исключение
  • конструкция try,
    которая определяет блок кода для перехвата исключений
  • конструкция catch,
    которая перехватывает исключения
  • класс exception,
    который является базовым классом для всех исключений
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить