您的位置:首页 > 编程语言 > C语言/C++

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

2014-08-03 20:49 453 查看
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对象。


                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: