据我所知,动态强制转换与静态强制转换的不同之处在于它对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进行基本到派生的转换.
RTTI信息仅适用于具有虚拟成员的班级.(假定的实现是vtable包含了dynamic_cast工作所需的内容;你可以设计出其他方案,但是在对象中都需要一个类型标识符,那么为什么不使用vptr呢?)
| 归档时间: |
|
| 查看次数: |
2640 次 |
| 最近记录: |