1.RTTI①需要额外的空间以存储类型信息,通常是一个指针,指向某个类型信息节点。②需要额外的时间以决定执行期的类型。
2.编译器为了支持RTTI策略,给需要多态的类声明一个或多个虚函数,把与该类相关的类型信息(类型描述器type_info)对象都放进虚函数表中(通常放入第一个slot,他是被编译器静态设定的,而非执行期由构造函数设定的),降低了额外负担(只需要一个指向虚函数表的指针)。
//获取pt的类型描述器 ((type_info*)(pt->vptr[0]))->_type_descriptor;
3.dynamic_cast通过把转换的目标类型的类型描述器和被转换的类型描述器交给一个运行时的库函数比较,比较结果吻合则实行转换,不吻合则返回0(用指针时)或者抛出异常(用引用时,因为引用设为0,会引起一个临时对象(拥有被引用的目标类型)被产生出来,该临时对象的初值被设为0,然后目标类型的引用被设定为该临时对象的一个别名,这是不合法的,所以需要抛出异常),转换成功则返回其地址或引用。
4.Typeid运算符传回一个类型为type_info的常量引用。type_info包含了相等运算符==、不等运算符!=,类型信息编码前的名字(name())和编码后的名字(raw_name())和对类型描述器排序的算法(如before)以及支持异常处理的函数(如在异常发生时提供关于指针、函数和类的更详细信息)。
5.内置类型也可以使用typeid,只不过这时候是静态绑定。