C++ RTTI typeid在g++编译环境中的类型

42 阅读1分钟

C++ RTTI(运行时类型识别)中使用typeinfo 获取类型时,VisulStudio和g++ 获取到的类型信息不尽一样。虽然看起来杂乱,但输出信息更详尽了,比如P2CB,标识输出的类型是一个指针,指向CB,CB名称的长度是2。而在VS中输出是CB。

例子

#include <iostream>
#include "typeinfo.h"
using namespace std;

class CB
{
     virtual void dowork(){};
};

class CD1: virtual public CB
{

};

class CD2: virtual public CB
{

};

class CD3:public CD1,public CD2
{
     public:
        const char* print_cd3(){
          const char *p = "CD3";

            return p;
        }

};

class CD5:public CD1
{
     public:
        const char* print_cd3(){
          const char *p = "CD5";

            return p;
        }

};

int main(int argc,char* argv[])
{
   CB *p = new CD3();
   CB *p2 = new CD5();
   cout<<typeid(std::string).name()<<endl;
   CD3 *pd3 = dynamic_cast<CD3*>(p);
   if (pd3)
   {
     cout<<pd3->print_cd3()<<endl;

   }

   if (typeid(*p) == typeid(CB))

   {
     cout<<"typeid(p) == typeid(CB)"<<endl;
   }
   
   

   cout<<"p's type name:"<<typeid(p).name()<<endl;
   cout<<"*p's type name:"<<typeid(*p).name()<<endl;
   cout<<"CB's type name:"<<typeid(CB).name()<<endl;
   cout<<typeid(*p2).name()<<endl;
   return 0;

}

输出结果

PS F:\cc++\first> g++ .\RTTIStudyMain.cpp -o rttiMain
PS F:\cc++\first> ./rttiMain
NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
CD3
p's type name:P2CB
*p's type name:3CD3
CB's type name:2CB
3CD5
PS F:\cc++\first>