为什么只有多态类才允许基于派生动态铸造

Why Base-to-Derived Dynamic Casting is Only Allowed for Polymorphic Classes

本文关键字:派生 许基于 动态 多态 为什么      更新时间:2023-10-16

可能重复:
常见问题解答:为什么dynamic_cast只有在一个类至少有一个虚拟方法的情况下才能工作?

我读到在C++中,对一组类的层次结构执行动态强制转换,只有在类是多态的情况下才允许强制转换,例如基类具有虚拟函数等。这种限制的原因是什么?用纯虚拟函数代替基类中的普通虚拟函数更"安全"吗?

谢谢!

造成这种限制的原因是什么?

只有当对象是目标类型的实例时,dynamic_cast才会成功。非多态类不包含任何类型信息,因此无法判断是否存在这种情况;因此,演员阵容不可能成功。

用纯虚拟函数代替基类中的普通虚拟函数更"安全"吗?

就多态性而言,两者都可以。如果基类至少有一个虚拟函数,那么它是多态的,因此可以与dynamic_cast一起使用。它是否是纯的只影响基类是否可以实例化。

这是由标准引起的限制。

在主要的实现中,dynamic_cast通过比较两个类的vfptr(虚拟函数表指针)来工作。

这是确定类在运行时是否相关的一种方法。此外,对非多态类执行dynamic_cast实际上没有意义。有static_cast

我的猜测是,如果您试图在非多态类上使用dynamic_cast,那么您做错了什么。如果你发布一些代码,我们可以提供帮助。

执行dynamic_cast时,会在运行时执行类型检查,并且在强制转换非法时抛出std::bad_cast异常或返回空指针。允许这样做的机制称为RTTI。

当类不是多态的时,就无法执行类型检查,因为在运行时没有存储类型信息。