RTTI:Run-Time Type Identification
先来看两个其他的~
typeid
c++中该函数用于获知一个变量的具体类型。
注意事项
1、type_id返回一个type_info对象的引用
2、如果想通过基类的指针获得派生类的数据类型,基类必须带有虚函数
3、只能获取对象的的实际类型不能判断指针的
dynamic_cast
dynamic_cast < type-id > ( expression ) ,该运算符把expression转换成type-id类型的对象。Type-id必须是类的指针、类的引用或者void *;如果type-id是类指针类型,那么expression也必须是一个指针,如果type-id是一个引用,那么expression也必须是一个引用。dynamic_cast主要用于类层次间的上行转换和下行转换,还可以用于类之间的交叉转换。在类层次间进行上行转换时dynamic_cast和static_cast的效果是一样的;在进行下行转换时,dynamic_cast具有类型检查的功能,比static_cast更安全。
注意事项
1、只能应用与指针和引用的转换
2、要转换的类型中必须有虚函数
3、若成功返回子类地址,失败返回NULL
#include <iostream>
#include <string>
using namespace std;
class Flyable
{
virtual void takeoff()=0;
virtual void land()=0;
};
class Bird :public Flyable
{
public:
void foraging()
{
cout<<"Bird-foraging"<<endl;
}
virtual void takeoff()
{
cout<<"Bird--takeoff"<<endl;
}
virtual void land()
{
cout<<"Bird--land"<<endl;
}
};
class Plane : public Flyable
{
public:
void carry()
{
cout<<"Plane--carry"<<endl;
}
virtual void takeoff()
{
cout<<"Plane--takeoff"<<endl;
}
virtual void land()
{
cout<<"Plane--land"<<endl;
}
};
void doSomething(Flyable *obj)
{
cout<<typeid(*obj).name()<<endl;
obj->takeoff();
if(typeid(*obj)==typeid(Bird))
{
Bird *bird=dynamic_cast<Bird *>(obj);
bird->foraging();
}
if(typeid(*obj) == typeid(Plane))
{
Plane *plane=dynamic_cast<Plane *>(obj);//把obj转化为Plane类型
plane->carry();
}
obj->land();
};
int main()
{
Bird b;
doSomething (&b);
system("pause");
return 0;
}