std::bad_cast
来自 cppreference.com
定义在头文件 <typeinfo> 中 |
||
class bad_cast : public std::exception; |
||
当对引用类型的 dynamic_cast 运行时检查失败(例如,类型之间没有继承关系)时,会抛出此类型的异常,并且在 std::use_facet 中如果请求的方面在区域设置中不存在时也会抛出异常。
继承关系图
内容 |
[编辑] 成员函数
(构造函数) |
构造一个新的 bad_cast 对象(公有成员函数) |
operator= |
替换 bad_cast 对象(公有成员函数) |
what |
返回解释性字符串 (公有成员函数) |
std::bad_cast::bad_cast
(1) | ||
bad_cast() throw(); |
(直到 C++11) | |
bad_cast() noexcept; |
(自 C++11 起) | |
(2) | ||
bad_cast( const bad_cast& other ) throw(); |
(直到 C++11) | |
bad_cast( const bad_cast& other ) noexcept; |
(自 C++11 起) | |
使用一个由实现定义的以 null 结尾的字节字符串构造一个新的 bad_cast
对象,该字符串可以通过 what() 访问。
1) 默认构造函数。
2) 复制构造函数。 如果 *this 和 other 都有动态类型
std::bad_cast
,那么 std::strcmp(what(), other.what()) == 0.(自 C++11 起)参数
other | - | 要复制的另一个异常对象 |
std::bad_cast::operator=
bad_cast& operator=( const bad_cast& other ) throw(); |
(直到 C++11) | |
bad_cast& operator=( const bad_cast& other ) noexcept; |
(自 C++11 起) | |
使用 other 的内容进行赋值。 如果 *this 和 other 都有动态类型 std::bad_cast
,那么赋值后 std::strcmp(what(), other.what()) == 0。(自 C++11 起)
参数
other | - | 要赋值的另一个异常对象 |
返回值
*this
std::bad_cast::what
virtual const char* what() const throw(); |
(直到 C++11) | |
virtual const char* what() const noexcept; |
(自 C++11 起) | |
返回解释性字符串。
参数
(无)
返回值
指向包含解释性信息的以 null 结尾的字符串的指针。该字符串适合转换为 std::wstring 并显示为 std::wstring。该指针保证至少在获得该指针的异常对象被销毁之前或在异常对象上的非 const 成员函数(例如复制赋值运算符)被调用之前有效。
备注
允许但不要求实现覆盖 what()
。
从 std::exception 继承而来
成员函数
[虚函数] |
销毁异常对象 ( std::exception 的虚公有成员函数) |
[虚函数] |
返回解释性字符串 ( std::exception 的虚公有成员函数) |
[编辑] 示例
运行此代码
#include <iostream> #include <typeinfo> struct Foo { virtual ~Foo() {} }; struct Bar { virtual ~Bar() { std::cout << "~Bar\n"; } }; struct Pub : Bar { ~Pub() override { std::cout << "~Pub\n"; } }; int main() { Pub pub; try { [[maybe_unused]] Bar& r1 = dynamic_cast<Bar&>(pub); // OK, upcast [[maybe_unused]] Foo& r2 = dynamic_cast<Foo&>(pub); // throws } catch (const std::bad_cast& e) { std::cout << "e.what(): " << e.what() << '\n'; } }
可能输出
e.what(): std::bad_cast ~Pub ~Bar