dynamic_cast需要多态类
Is polymorphic class required for dynamic_cast?
我已经对此进行了一些搜索,但只是为了确保:
使用dynamic_cast
将基类指针强制转换为派生类指针需要基类是多态的?否则我们甚至无法编译?
谢谢。
您可以使用dynamic_cast将派生类强制转换为非多态基类。但是不能将非多态基dynamic_cast转换为派生类。
标准解释(§5.2.7):
(1) 表达式dynamic_cast(v)(…)的结果
(5) 如果T是"指向cv1 B的指针",v的类型为"指向cv2 D的指针"使得B是D的基类,则结果是指向v所指向的D对象的唯一B子对象的指针。
(6) 否则,v应为多态型的指针或glvalue
多态性在这里的意思是非常谦虚的:一个声明或的类继承的虚拟函数称为多态类";(§10.3/1)
对于Upcasts,基类类型(即casted表达式的类型)必须是多态的,否则会出现编译器错误。这是因为dynamic_cast
使用RTTI来执行强制转换并检查它是否成功,而RTTI仅针对多态类型生成。
static_cast
则不检查强制转换是否有效;如果不是,则强制转换调用未定义的行为。static_cast
只是从指针(或引用的内部指针)中添加或减去一个偏移量。dynamic_cast
执行运行时类型检查。
相关文章:
- 多态性和功能结合
- 具有默认模板参数的多态类的模板推导失败
- 找不到成员对象:没有名为get_event()的成员,也处理多态性和向量
- 多态二进制函数
- 访问存储在向量C++中的结构的多态成员
- 使用取消引用的指针的多态性会产生意外的结果.为什么?
- 将 std::allocate_shared 与多态资源分配器一起使用
- 通过switch和static_cast访问多态对象的运行时类型
- C++boost序列化多态性问题
- 多态杆件变量 - 类设计
- 如何查找哪个类对象位于数组的特定索引上(多态性)
- 如何在多线程中正确使用unique_ptr进行多态性?
- Doees the 'this' 指针参与虚函数的多态行为
- C++ 在堆栈中包含多态属性的类对象存储
- 基类和派生类的多态赋值运算符
- 转身多态对象
- 如何在基类指针向量的元素上应用重载的多态函数
- 具有智能指针的多态性
- 当目标指针不是基类的类型时,为什么允许dynamic_cast为多态类生成 null 指针?
- C++事件系统 - 多态事件和事件处理程序