据我了解,动态转换与静态转换的不同之处在于它对 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
这段代码中的第二次转换会产生编译错误,因为dynamic_cast 不允许基类到派生的转换,除非基类是多态的。