C ++: как посмотреть содержимое vptr / vtable

Каждый объект C ++, имеющий виртуальную функцию, имеет vptr, который указывает на vtable. Как я могу увидеть, что это за vptr и на какое содержание он указывает? Я понимаю, что это зависит от компилятора, и он может поместить vptr в любом месте пространства памяти объекта. Но могу ли я найти то, что есть?

Приветствия.

0

Решение

В этом конкретном случае C имеет один vtable, а A и B не имеют ни одного. Вы можете убедиться в этом сами, выделив функции-члены Си, так что vtable будет фактически выведен, и исправив другие ошибки компиляции:
extern «C» int put (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"); }

По шагам выше вы можете найти контент, на который он указывает.

0

Другие решения


По вопросам рекламы [email protected]