为什么从类到子类的动态转换要求类是多态的?

Eps*_*tor 2 c++ casting rtti

据我所知,动态强制转换与静态强制转换的不同之处在于它对RTTI的使用,以及如果变量的动态类型 - 从基础转换为派生 - 不适合时,它会失败的事实.但是,如果我们还有RTTI,为什么这个类必须是多态的呢?

编辑:由于对"多态"一词的使用存在一些混淆,这里是cplusplus.com中的条目,促使我这样问:

dynamic_cast只能用于指针和对象的引用.其目的是确保类型转换的结果是所请求类的有效完整对象.

因此,当我们将一个类转换为其基类之一时,dynamic_cast总是成功的

classes: class CBase { };
class CDerived: public CBase { };

CBase b; CBase* pb; CDerived d;
CDerived* pd;

pb = dynamic_cast<CBase*>(&d);     //ok: derived-to-base 
pd = dynamic_cast<CDerived*>(&b);  //wrong: base-to-derived 
Run Code Online (Sandbox Code Playgroud)

这段代码中的第二次转换会产生编译错误,因为除非基类是多态的,否则不允许使用dynamic_cast进行基本到派生的转换.

http://www.cplusplus.com/doc/tutorial/typecasting/

APr*_*mer 7

RTTI信息仅适用于具有虚拟成员的班级.(假定的实现是vtable包含了dynamic_cast工作所需的内容;你可以设计出其他方案,但是在对象中都需要一个类型标识符,那么为什么不使用vptr呢?)