以下内容源于慕课网的学习整理,如有侵权,请告知删除。
1、RTTI(Run-Time Type Information),运行时类型识别。
- 涉及typeid、dynamic_cast这两个知识点。
- RTTI技术可以通过父类指针,识别其所指向对象的真实数据类型。
2、如下面的例子
- 首先是一些类的定义
- 我们希望在一个函数里,根据不同的类的对象,进行不同的操作,如下
- 涉及到了typeid和dynamic_cast的用法。
3、上面例子的细节
(1)dynamic_cast的注意事项
- 只能应用于指针和引用的转换,即()中是指针或者引用;
- 要转换的类型中必须包含虚函数,即< >中所对应的类中应该包含虚函数。
- 转换成功返回子类的地址,失败返回NULL。即< >中的类,应该是()中的类的子类。
(2)typeid的注意事项
- typeid返回一个type_info对象的引用;
- 如果想要通过基类的指针获得派生类的数据类型,基类必须带有虚函数。
- 只能获取对象的实际类型。
- 上面代码中*obj表示一个对象的类型?比如是Bird或者Plane类型。
- 因此typeid(*obj).name()得到类型,如Bird或者Plane。
4、代码示例
#include <iostream>
#include <stdlib.h>
#include <string>
#include <typeinfo>
using namespace std;/*** 定义移动类:Movable* 纯虚函数:move*/
class Movable
{
public:virtual void move()=0;
};/*** 定义公交车类:Bus* 公有继承移动类* 特有方法carry*/
class Bus : public Movable
{
public:virtual void move(){cout << "Bus -- move" << endl;}virtual void carry(){cout << "Bus -- carry" << endl;}
};/*** 定义坦克类:Tank* 公有继承移动类* 特有方法fire*/
class Tank :public Movable
{
public:virtual void move(){cout << "Tank -- move" << endl;}virtual void fire(){cout << "Tank -- fire" << endl;}
};/*** 定义函数doSomething含参数* 使用dynamic_cast转换类型*/
void doSomething(Movable *obj)
{obj->move();if(typeid(*obj)==typeid(Bus)){Bus *bus=dynamic_cast<Bus*>(obj);bus->carry();}if(typeid(*obj)==typeid(Tank)){Tank* tank=dynamic_cast<Tank*>(obj);tank->fire();}
}int main(void)
{Bus b;Tank t;doSomething(&b);doSomething(&t);return 0;
}