Класс 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"