dynamic_cast需要多态类

Is polymorphic class required for dynamic_cast?

本文关键字:多态 cast dynamic      更新时间:2023-10-16

我已经对此进行了一些搜索,但只是为了确保:

使用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执行运行时类型检查。