//by 鸟哥 演示运行时类型识别
//有疑问请留言或加群 1032082534
#include <iostream>
#include <typeinfo>
#include <cstring>
using namespace std;
class Parent
{
public:
virtual ~Parent(){};
};
class Child : public Parent
{
};
class Child2 : public Parent
{
};
void test(Parent* p)
{
if(typeid(*p).hash_code() == typeid(Child).hash_code() )
{
cout<<"Child"<<endl;
}
else if( typeid(*p).hash_code() == typeid(Child2).hash_code() )
{
cout<<"Child2"<<endl;
}
else if( typeid(*p).hash_code() == typeid(Parent).hash_code() )
{
cout<<"Parent"<<endl;
}
}
int main()
{
Parent parent;
Child child;
Child2 child2;
int index;
char ch;
const type_info& tp = typeid(parent);
const type_info& tc = typeid(child);
const type_info& tn = typeid(child2);
const type_info& ti = typeid(index);
const type_info& tch = typeid(ch);
cout<<tp.name()<<endl;// 6Parent,不同c++实现可能有所不同
cout<<tc.name()<<endl;//5Child
cout<<tn.name()<<endl;//6Child2
cout<<ti.name()<<endl;
cout<<tch.name()<<endl;
cout<<typeid(&parent).name()<<endl;//P6Parent
cout<<typeid(&child).name()<<endl;//P5Child
cout<<typeid(&child2).name()<<endl;//P6Child2
cout<<typeid(&index).name()<<endl;
cout<<typeid(&ch).name()<<endl;
Parent* parent_p=&parent;
Parent* child_p=&child;
Parent* child2_p=&child2;
cout<<typeid(parent_p).name()<<endl;//P6Parent
cout<<typeid(child_p).name()<<endl;//P6Parent
cout<<typeid(child2_p).name()<<endl;//P6Parent
cout<<typeid(*parent_p).name()<<endl;//6Parent
cout<<typeid(*child_p).name()<<endl;//5Child
cout<<typeid(*child2_p).name()<<endl;//6Child2
test(&parent);
test(&child);
test(&child2);
return 0;
}
运行结果:
6Parent
5Child
6Child2
i
c
P6Parent
P5Child
P6Child2
Pi
Pc
P6Parent
P6Parent
P6Parent
6Parent
5Child
6Child2
Parent
Child
Child2