RTTI(Run-Time Type Information),通过运行时类型信息程序能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际派生类型。
在C++中存在虚函数,也就存在了多态性,对于多态性的对象,在程序编译时可能会出现无法确定对象的类型的情况。当类中含有虚函数时,其基类的指针就可以指向任何派生类的对象,这时就有可能不知道基类指针到底指向的是哪个对象的情况,类型的确定要在运行时利用运行时类型标识做出。
为了获得一个对象的类型可以使用typeid函数,该函数反回一个对type_info类对象的引用.形式为const type_info& typeid()
因为type_info类的复制构造函数和赋值运算符都是私有的,所以不允许用户自已创建type_info的对象,比如type_info A;错误,没有默认的构造函数。唯一要使用type_info类的方法就是使用typeid函数
typeid函数使用方式:
使用type_info类中的name()成员函数反回对象的类型的名称。
使用type_info类中重载的= =与!=比较两个对象的类型是否相等
dynamic_cast强制转换运算符
该转换符用于将一个指向派生类的基类指针或引用转换为派生类的指针或引用,注意dynamic_cast转换符只能用于含有虚函数的类,其表达式为dynamic_cast<类型>(表达式),其中的类型是指要将表达式转换成的目标类型。
比如
<span style="font-size:14px;">B *pb;
D *pd, md;
pb=&md;
pd=dynamic<D*>(pb); </span>
一般情况下不推荐这样使用 dynamic_cast 转换符,因为dynamic_cast的转换并不会总是成功的。
PS.:
1. dynamic_cast转换符只能用于指针或者引用
2. dynamic_cast转换符只能用于含有虚函数的类
3. dynamic_cast转换操作符在执行类型转换时首先将检查能否成功转换,如果能成功转换则转换之,如果转换失败,如果是指针则反回一个0值,如果是转换的是引用,则抛出一个bad_cast异常
某些编译器(如 Visual C++)默认状态是禁用 RTTI 的,目的是消除性能上的开销。
如果程序确实使用了 RTTI,一定要记住在编译前启用 RTTI。(vc6.0启用方式:project->setting->c/c++->category->c++ Language 下面第二个复选框选中)。使用 typeid 可能产生一些将来的维护问题。
使用 dynamic_cast需要我们付出代价,与 typeid 相比,dynamic_cast 不是一个常量时间的操作。
RTTI的运行开销主要是有进行整型比较和取地址操作所增加的时间开销。能用虚函数解决的不要用“dynamic_cast";