RTTI:Run-Time Type Identification
称为运行时类型识别。
下面使用例子来说明
#include <iostream>
#include <string>
using namespace std;
class Flyable //接口类,飞行
{
public:
virtual void takeoff() = 0; //起飞
virtual void land() = 0; //降落
};
class Bird : public Flyable
{
public:
Bird(string name) { B_name = name; cout << B_name << endl;}
void eat() { cout << "eating" << endl; }
virtual void takeoff() { cout << "Bird-takeoff" << endl; }
virtual void land() { cout << "Bird-land" << endl; }
private:
string B_name;
};
class Plane : public Flyable
{
public:
Plane(string code) { P_code = code; cout << P_code << endl;}
void carry() { cout << "carry" << endl; }
virtual void takeoff() { cout << "Plane-takeoff" << endl; }
virtual void land() { cout << "Plane-land" << endl; }
private:
string P_code;
};
void Do(Flyable* a)
{
a->takeoff();
if (typeid(*a) == typeid(Bird)) //判断是不是Bird
{
Bird* b = dynamic_cast<Bird*>(a);
b->eat();
}
else //不是则是Plane
{
Plane* c = dynamic_cast<Plane*>(a);
c->carry();
}
a->land();
}
int main()
{
Bird mybird("小鸟");
Plane myplane("007");
Do(&mybird);
Do(&myplane);
}
dynamic_cast注意事项:
1、只能应用于指针和引用的转换。
2、要转换的类型中必须包括虚函数。
3、转换成功返回子类地址,失败返回NULL。
typeid的注意事项:
1、type_id返回一个type_info对象的引用。
2、如果想通过基类的指针获得派生类的数据类型,基类必须带有虚函数。
3、只能获取对象的实际类型。