学习内容:
运行时类型识别(TRRI)学习产出:
typeid需要包含头文件typeinfo
- 关键字:typeid使用注意内容
● type_id返回一个type_info对象的引用;
● 如果想通过基类的指针获得派生类的数据类型,基类必须带有虚函数;
● 只能获取对象的实际类型;
下面展示一些 type_info内容
。
class type_info {
public:
const char* name() const;
bool operator==(const type_info& rhs) const;
bool operator!=(const type_info& rhs) const;
int before(const type_info& rhs) const;
virtual ~type_info();
pribate:
... ...
};
- 关键字:dynamic_cast 使用注意内容
● 只能应用与指针与引用的转换;
● 要转换的类型中必须包含虚函数;
● 如果转换成功返回子类的地址,失败返回NULL;
下面展示 示例代码
。
#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;
}
void carry()
{
cout << "Bus -- carry" << endl;
}
};
/**
* 定义坦克类:Tank
* 公有继承移动类
* 特有方法fire
*/
class Tank : public Movable
{
public:
virtual void move()
{
cout << "Tank -- move" << endl;
}
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;
}