# RTTI RTTI是运行阶段类型识别(Running Type Identification)的简称。这是新添加的特性之一。RTTI旨在程序在运行阶段确定对象的类型提供一个标准方式。很多类库已经为其类对象提供了实现这种功能的方式,但是由于C++内部并不支持,因此有多种不兼容的机制。 ## RTTI的用途 跟踪对象的类型,得到对象的类型。 ## RTTI工作原理 C++有3个支持RTTI的元素。 - 如果可能的话,dynamic_cast运算符将使用一个指向基类的指针来生成一个指向派生类的指针,否则该运算符返回0(空指针)。 - `typeid` 运算符返回一个指出对象的类型的值。 - `type_info` 结构存储了有关特定类型的信息。 只能将RTTI用于包含虚函数的类层次结构,原因在于只有对于这种层次结构,才应该将派生对象的地址赋给基类指针。 ==注意:RTTI只适用于包含虚函数的类。== ### 1. dynamic_cast运算符 dynamic_cast运算符是最常见的RTTI组件,它不能回答指针指向的是哪类对象,但能够回答是否可以安全地将对象的地址赋给特定类型的指针。 ```C++ class Grand { // has virtual methods }; class Superb: public Grand {...}; class Magnificent: public Super {...}; //假设有这样的指针 Grand * pg = new Grand; Grand * ps = new Superb; Grand * pm = new Magnificent; // Superb * pm = dynamic_cast(pg); //指针pg的类型是否可以被安全地转换为Superb *, 如果可以,运算符将返回对象的地址,否则返回一个空指针。 //通常,如果指向的对象(*pt)的类型为Type或者是从Type直接或者间接派生而来的类型,则下面的表达式将指针pt转换为Type类型的指针: dynamic_cast(pt); //否则,结果为0,即空指针。 ```