为什么只有多态类才允许基于派生动态铸造
Why Base-to-Derived Dynamic Casting is Only Allowed for Polymorphic Classes
可能重复:
常见问题解答:为什么dynamic_cast只有在一个类至少有一个虚拟方法的情况下才能工作?
我读到在C++中,对一组类的层次结构执行动态强制转换,只有在类是多态的情况下才允许强制转换,例如基类具有虚拟函数等。这种限制的原因是什么?用纯虚拟函数代替基类中的普通虚拟函数更"安全"吗?
谢谢!
造成这种限制的原因是什么?
只有当对象是目标类型的实例时,dynamic_cast
才会成功。非多态类不包含任何类型信息,因此无法判断是否存在这种情况;因此,演员阵容不可能成功。
用纯虚拟函数代替基类中的普通虚拟函数更"安全"吗?
就多态性而言,两者都可以。如果基类至少有一个虚拟函数,那么它是多态的,因此可以与dynamic_cast
一起使用。它是否是纯的只影响基类是否可以实例化。
这是由标准引起的限制。
在主要的实现中,dynamic_cast
通过比较两个类的vfptr
(虚拟函数表指针)来工作。
这是确定类在运行时是否相关的一种方法。此外,对非多态类执行dynamic_cast
实际上没有意义。有static_cast
。
我的猜测是,如果您试图在非多态类上使用dynamic_cast
,那么您做错了什么。如果你发布一些代码,我们可以提供帮助。
执行dynamic_cast
时,会在运行时执行类型检查,并且在强制转换非法时抛出std::bad_cast
异常或返回空指针。允许这样做的机制称为RTTI。
当类不是多态的时,就无法执行类型检查,因为在运行时没有存储类型信息。
相关文章:
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 如何在工厂方法中返回指向基于基础操作系统的派生类的有效指针
- 基于派生类型的编译时行为分支
- 如何从包含基类指针的容器中调用派生类函数(基于其类型)?
- CRTP:基于派生类内容的基类启用方法
- 基于布尔标志有效地派生公共函数的两个版本
- CRTP:具有基于派生参数的函数
- 基于参数创建基类中的派生类
- 基于模板的成员初始化,其中模板是抽象类的派生
- 如何基于特定派生类调用方法
- 如何基于一些派生类型生成元组
- 为什么只有多态类才允许基于派生动态铸造
- c++ 11派生对象上基于范围的for循环
- 基于string的派生类选择
- 初始化派生类中基于 C 的 API 提供的基于 C 的类型定义结构?
- C++ 基于模板的派生类和变量参数的构造函数
- 基类指针,基于派生类型调用方法
- 在c++中基于另一个变量类型派生一个变量类型