8

我在 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  

我得到与之前相同的输出。还有其他解决方案吗?

4

2 回答 2

12

您需要使用c++filt -tfor 类型,因此以下内容应该可以工作:

./shape | c++filt -t

c++filt的手册页说明以下内容-t

尝试对类型和函数名称进行分解。这是默认禁用的,因为重整类型通常仅在编译器内部使用,并且它们可能与非重整名称混淆。例如,一个名为“a”的函数被视为一个重整的类型名称,它将被重整为“signed char”。

于 2013-09-25T13:06:33.697 回答
2

您使用的是哪个版本的 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;

whereptr指向带有RTTI的某个对象(即带有一些虚拟方法,尤其是虚拟析构函数)。

于 2013-09-25T13:08:30.420 回答