从基类强制转换为派生类会引发异常

Casting to derived class from base class throws exception

本文关键字:异常 派生 基类 转换      更新时间:2023-10-16

我有 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可以引发异常。