首页 > 代码库 > 运行时类型识别RTTI

运行时类型识别RTTI

1、什么是RTTI?

RTTI:Run-Time Type Identification运行时类型识别

程序在运行时能够使用基类的指针或引用来检查这些指针或引用所指的对象的实际的派生类。

在这里要用到两个C++中的关键字:typeiddynamic_cast

2、typeid

typeid是C++中一个用来获取变量类型的关键字,用法跟使用函数一样 typeid(xxx)

typeid注意事项:

(1)typeid返回的是一个type_info对象的引用,而这个引用是与具体的变量类型有关的,

也就是说不同的变量类型都有一个type_info结构体。

(2)xxx可以是一个变量名,也可以是一个具体的变量类型,通常是用来做比较的时候,如下例子所示:

int  i  =  0;
cout << typeid(i) << endl;
cout << typeid(&i) << endl;
if (typeid(i) == typeid(int)) { }

(3)如果我们想通过基类的指针获得派生类的数据类型,基类必须带有虚函数,否则获取的就是基类的类型,并且只能够去获取派生类对象的实际类型,

也就是说我们typeid传参的时候只能是对象类型,不能是对象指针。

背景:因为我们可以通过基类的指针变量指向一个派生类变量的地址,而typeid关键字提供了使用基类指针去获取派生类对象的数据类型

技术分享
 1 #include <iostream>
 2 using namespace std;
 3 
 4 class Fly1{
 5 public:
 6     virtual void fly(void) = 0;    // 含有虚函数
 7 };
 8 
 9 class Fly2{
10 public:
11     void fly(void) { }         // 不含虚函数
12 };
13 
14 class Plane1 : public Fly1    //   继承含有虚函数的基类
15 {
16 public:
17     virtual void fly(void);
18     void transport(void);
19 };
20 
21 class Plane2 : public Fly2     // 继承不含虚函数的基类
22 {
23 public:
24     virtual void fly(void);
25     void transport(void);
26 };
27 
28 int main(void)
29 {
30        Fly1 *fly1 = new Plane1();    // 创建基类指针向子类
31        Fly2 *fly2 = new Plane2();    
32   
33            cout << typeid(fly1).name() << endl;     // 打印显示:class dasdasd                                      
34     cout << typeid(*fly1).name() << endl;
35         cout << typeid(fly2).name() << endl;
36         cout << typeid(*fly2).name() << endl;
37   
38         return 0;       
39 }
View Code

 

运行时类型识别RTTI