我已经做了一些搜索,但只是为了确保:
使用dynamic_cast
强制转换派生类指针的基类指针需要基类是多态的吗?否则我们甚至无法编译?
感谢。
答案 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
执行运行时类型检查。