dynamic_cast需要多态类吗?

时间:2014-09-14 21:36:26

标签: c++

我已经做了一些搜索,但只是为了确保:

使用dynamic_cast强制转换派生类指针的基类指针需要基类是多态的吗?否则我们甚至无法编译?

感谢。

2 个答案:

答案 0 :(得分:2)

您可以使用dynamic_cast将派生类强制转换为非多态基类。但是你不能将非多态基础dynamic_cast到一个派生类。

标准解释(§5.2.7):

  

(1)表达式dynamic_cast(v)(...)

的结果      

(5)如果T是“指向cv1 B的指针”并且v具有类型“指向cv2 D的指针”使得B是D的基类,则结果是指向D对象的唯一B子对象的指针通过v。

     

(6)否则,v应是指向多态类型的指针或glvalue

这里的多态性意味着一种非常谦逊的意义:“一个声明或者声明的类 继承虚函数称为多态类。“(§10.3/ 1)。

答案 1 :(得分:1)

对于Upcast,基类类型 - 它是类型化的表达式 - 必须是多态的,otherwise you get a compiler error。 这是因为dynamic_cast使用RTTI来执行强制转换并检查它是否成功 - 并且只为多态类型生成RTTI。

另一方面,

static_cast不会检查演员表是否有效;如果不是,则演员调用未定义的行为。 static_cast只是添加或减去指针(或引用的内部指针)的偏移量。 dynamic_cast执行运行时类型检查。