C++中的RTTI与dynamic_cast<> static_cast<>

C++中多态的存在导致一个类型的真实类型无法确切知晓,于是RTTI(runtime Type Identification)机制应运而生。

在生成类对象模型的时候,我们会发现多了一个type_info的一项,这个便是为了方便RTTI机制确认类型所用的。

关键字typeid()运算符,它以一个对象或者类型名作为参数,返回一个匹配的const type_info对象,标明该对象的确切类型,和sizeof()一样是c++语言直接支持的。

  例:if(typeid(device)==typeid(Television))其中Television是device的派生类。


当然这里的typeid同样可以用来检索非多态类型对象和基本数据类型对象的类型信息,只不过此时它不会去检索对象的vptr甚至vtable。


dynamic_cast<>运算符和static_cast<>运算符的区别:

其中static_cast是相当于c的强制类型转换,用起来可能有一点危险。dynamic_cast如果转换成引用出错的话,就会出现异常,这里需要做一个异常处理的机制。转换指针出错返回null。

dynamic_cast:

  支持来两个方向上的转换upcast和downcast.

第一种:支持由派生类的指针或引用向基类型的指针或应用。虽然这种方式可以隐式转化得到。

第二种:如果基类指针或引用实质上指向的便是派生类对象则转换便能成功,否则失败,返回NULL。



RTTi由于它的方便也同时带来了相应的副作用,不仅在执行速度上而且在程序体积上都带来了额外的开销。因为他需要额外的内存来存放type_info对象。

 


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值