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>