C++ 动态_cast是否需要多态类?

C++ 动态_cast是否需要多态类?,c++,C++,我已经对此进行了一些搜索,但只是为了确保: 使用dynamic\u cast将基类指针强制转换为派生类指针需要基类是多态的?否则我们甚至无法编译 谢谢。您可以使用dynamic_cast将派生类强制转换为非多态基类。但不能将非多态基类强制转换为派生类 本标准解释了(§5.2.7): (1) 表达式dynamic_cast(v)(…)的结果 (5) 如果T是“指向cv1 B的指针”,而v的类型是“指向cv2 D的指针”,因此B是D的基类,则结果是指向v指向的D对象的唯一B子对象的指针 (6) 否则

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

使用
dynamic\u 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)。

对于向上转换,基类类型(即转换表达式的类型)必须是多态的。 这是因为
dynamic\u cast
使用RTTI执行强制转换,并检查转换是否成功,并且RTTI仅为多态类型生成


另一方面,
static_cast
不检查强制转换是否有效;如果不是,则强制转换将调用未定义的行为
static_cast
仅从指针(或引用的内部指针)添加或减去偏移量<代码>动态\u cast执行运行时类型检查。

基类需要至少有一个虚拟函数,以便动态\u cast工作,这将使其具有多态性,这就是我的想法。谢谢。严格地说,它不必是多态的——例如,你可以有一个类,它有一个虚拟析构函数,并且满足dyamic_cast标准,但不满足polymorph类标准,因为只有一个类具有定义的行为(当然,在这种情况下使用dynamic cast是毫无意义的,但这是一个稍微不同的问题)我明白了,所以基本上至少有一个方法(成员函数或析构函数)必须附加一个“虚拟的”。正确的,一些成员函数,包括析构函数或一些伪成员需要是虚拟的(并定义!)这样对象就得到一个vtable,然后用它来确定类是否匹配。