据我了解,动态转换与静态转换的不同之处在于它对 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
这段代码中的第二次转换将产生编译错误,因为除非基类是多态的,否则动态_cast 不允许进行基类到派生类的转换。
http://www.cplusplus.com/doc/tutorial/typecasting/ http://www.cplusplus.com/doc/tutorial/typecasting/
RTTI 信息仅适用于具有虚拟成员的班级。 (假设的实现是 vtable 包含dynamic_cast 工作所需的内容;您可以制定其他方案,但所有方案都需要对象中的类型标识符,所以为什么不使用 vptr?)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)