RTTI机制
C++是一种静态类型语言。其数据类型是在编译期就确定的,不能在运行时更改。然而由于面向对象程序设计中多态性的要求,C++中的指针或引用(Reference)本身的类型,可能与它实际代表(指向或引用)的类型并不一致。有时我们需要将一个多态指针转换为其实际指向对象的类型,就需要知道运行时的类型信息,于是产生了运行时类型识别的要求。C++要想获得运行时类型信息,可以通过RTTI机制。RTTI(Run Time Type Identification)即通过运行时类型识别,程序能够通过基类的指针或引用获知这些指针或引用所指的对象的实际派生类型。本来基类指针的作用就是使代码能够获得一个统一的接口,现在要逆过来,通过这个基类指针来知道它的实际派生类型,即通过一堆if来判断。RTTI提供了两个非常有用的操作符:typeid 和 dynamic_cast:
typeid:返回指针或引用所指对象的实际类型。它返回一个对type_info类对象的引用,要使用typeid必须使用头文件<typeinfo>。对非引用类型,typeid是在编译时期识别的,只有引用类型才会在运行时识别。运行时获知变量类型名称,可以使用 typeid(变量).name(),需要注意不是所有编译器都输出"int"、"float"等之类的名称,对于这类的编译器可以这样使用:
下面举一个例子:
dynamic_cast:只能用于含有虚函数的类转换,用于类向上和向下转换。dynamic_cast可以做类之间上下转换,转换的时候会进行类型检查,类型相等成功转换,类型不等
转换失败。运用RTTI技术,RTTI是”Runtime Type Information”的缩写,意思是运行时类型信息,它提供了运行时确定对象类型的方法。在c++层面主要体现在dynamic_cast和typeid。将一个基类对象指针(或引用)转换到继承类指针,dynamic_cast会根据基类指针是否真正指向继承类指针来做相应处理。如果一条dynamic_cast语句的转换目标是指针类型并且转换失败了,会返回一个空指针。如果基类或者子类没有任何虚函数(如果基类有虚函数表,子类当然是自动继承了该表),当他们作为dynamic_cast的源类型进行转换时,编译会失败。