c++11运行时类型识别(RTTI)

//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

发布了60 篇原创文章 · 获赞 10 · 访问量 3709

猜你喜欢

转载自blog.csdn.net/sinat_18811413/article/details/104513647