C ++:如何查看vptr / vtable内容

时间:2014-11-28 04:54:31

标签: c++ vtable vptr

具有虚函数的每个C ++对象都有一个指向vtable的vptr。我怎样才能看到这个vptr是什么,以及它指向的内容?我知道这是依赖编译器的,它可以将vptr放在对象内存空间的任何地方。但无论如何我能找到它是什么?

干杯。

1 个答案:

答案 0 :(得分:0)

在这种特定情况下,C有一个vtable而A和B没有。您可以通过C语言的成员函数来自己看到这一点,以便实际发出vtable,并纠正其他编译错误:     extern“C”int puts(const char *);

struct A { virtual void func_1() = 0; };
struct B { virtual void func_2() = 0; };

struct C : A, B
{
  void func_1();
  void func_2();
};

...编译到目标文件,然后查看符号:

$ gcc -c test.cc
$ nm test.o | c++filt
                 U puts
0000000000000000 T C::func_1()
000000000000001a T C::func_2()
0000000000000033 T non-virtual thunk to C::func_2()
0000000000000000 V typeinfo for A
0000000000000000 V typeinfo for B
0000000000000000 V typeinfo for C
0000000000000000 V typeinfo name for A
0000000000000000 V typeinfo name for B
0000000000000000 V typeinfo name for C
0000000000000000 V vtable for C
                 U vtable for __cxxabiv1::__class_type_info
                 U vtable for __cxxabiv1::__vmi_class_type_info
    void C::func_1() { puts("func_1"); }
    void C::func_2() { puts("func_2"); }

通过上述步骤,您可以找到它指向的内容。