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对象。