我在GCC C ++ 编译器上运行代码,输出type_info :: name:
#include <iostream>
#include <typeinfo>
using namespace std;
class shape {
protected:
int color;
public:
virtual void draw() = 0;
};
class Circle: public shape {
protected:
int color;
public:
Circle(int a = 0): color(a) {};
void draw();
};
void Circle::draw() {
cout<<"color: "<<color<<'\n';
}
class triangle: public shape {
protected:
int color;
public:
triangle(int a = 0): color(a) {};
void draw();
};
void triangle::draw() {
cout<<"color: "<<color<<'\n';
}
int main() {
Circle* a;
triangle* b;
cout<<typeid(a).name()<<'\n';
cout<<typeid(b).name()<<'\n';
}
但我得到以下结果:
P6Circle
P8triangle
并且关于消防,
./shape | c++filt
我得到的输出与之前相同。还有其他解决办法吗?
答案 0 :(得分:10)
您需要对c++filt -t
使用类型,因此以下内容应该有效:
./shape | c++filt -t
man page for c++filt对-t
说明了以下内容:
尝试解码类型和函数名称。默认情况下禁用此选项,因为损坏的类型通常仅在编译器内部使用,并且可能与非损坏的名称混淆。例如,一个被称为“a”的函数被视为一个受损的类型名称,将被解构为“signed char”。
答案 1 :(得分:1)
您使用的是哪个版本的GCC(及其相应的 libstdc ++ )?
GCC 4.8,我有
static inline std::string
demangled_type_info_name(const std::type_info&ti)
{
int status = 0;
return abi::__cxa_demangle(ti.name(),0,0,&status);
}
然后我可以使用
std::cout << demangled_type_info_name(typeid(*ptr)) << std::endl;
其中ptr
指向具有RTTI的某个对象(即使用某些虚拟方法,尤其是虚拟析构函数)。