从基类强制转换为派生类会引发异常
Casting to derived class from base class throws exception
我有 3 个继承类:Base
-> Intermediate
-> Derived
。
为什么当我使用 dynamic_cast
时它会引发异常?
class Base { ... };
class Intermediate : public Base { ... };
class Derived : public Intermediate { ... };
Base* base = new Derived();
// No throw
auto intermediate = static_cast<Intermediate *>(base);
auto derived1 = static_cast<Derived *>(base);
auto derived2 = static_cast<Derived *>(intermediate);
// All throw
// (vcruntime140d.dll): Access violation reading location [...].
auto intermediate = dynamic_cast<Intermediate *>(base);
auto derived1 = dynamic_cast<Derived *>(base);
auto derived2 = dynamic_cast<Derived *>(intermediate);
当强制转换为指向派生类的指针时,dynamic_cast
的操作数应该是指向多态类型的指针,多态类型是声明或继承虚函数的类,而static_cast
没有此约束。
作为回报,如果操作数实际上没有指向目标类型的对象的子对象,而static_cast
将其保留为未定义,则dynamic_cast
可以引发异常。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 无法引发 CException 派生异常?
- 获取指向派生类的指针在 C++ 中以运行时异常结束
- 为什么隐式转换在异常处理中从派生到基?
- 从基类强制转换为派生类会引发异常
- C++ 实例化派生类的语法异常
- 通过引用派生类对象从基类对象执行向下转换时引发bad_cast异常
- 基类catch不捕获异常,即使它出现在派生类catch之前
- 为什么当我抛出派生类的对象时,基类的 catch 块会捕获异常
- C++异常处理如何处理异常派生类
- 捕获派生异常类型在 Clang/MacOS X 上失败
- 为什么派生类异常可以被基类捕获子句捕获
- 来自异常声明的派生对象类型是否意外
- 未捕获从std::异常派生的C++自定义异常
- 不能从派生类抛出基类异常
- 未捕获派生异常类
- 派生自库中的std::exception:仅头文件解决方案是否适用于捕获异常
- c++的bad_cast异常将*this强制转换为派生模板类
- 在派生类的析构函数中抛出异常
- 如何捕获一般异常并显示其派生的 what()