Пример кода:
class base {
int val1;
public:
base(int val): val1(val)
{
}
virtual void basefunc()
{
std::cout << "I am in base func";
}
virtual ~base()
{
std::cout << "I am in base destructor";
}
};
class derived: public base
{
int val2;
public:
derived(int val): base(100), val2(val)
{
}
virtual void basefunc() {
std::cout << "I am in derived func";
}
virtual ~derived()
{
std::cout << "I am in derived destructor";
}
};
int main()
{
base b = base(10);
derived d = derived(2);
base *ptr = &b;
ptr->basefunc();
ptr = &d;
ptr->basefunc();
}
Затем я попытался проверить vtable классов и на выходе получилось:
(gdb) p b._vptr$base[0]
$77 = (int (*)(void)) 0x100006ee0 <base::basefunc()>
(gdb) p b._vptr$base[1]
$78 = (int (*)(void)) 0x100006b30 <base::~base()>
(gdb) p b._vptr$base[2]
$79 = (int (*)(void)) 0x100006f10 <base::~base()>
(gdb) p b._vptr$base[3]
$80 = (int (*)(void)) 0x7fff87fd7fe8
(gdb) p b._vptr$base[4]
$81 = (int (*)(void)) 0x10000eda8 <typeinfo name for base>
(gdb) p b._vptr$base[5]
$82 = (int (*)(void)) 0x0
(gdb) p d._vptr$base[0]
$88 = (int (*)(void)) 0x100006fb0 <derived::basefunc()>
(gdb) p d._vptr$base[1]
$89 = (int (*)(void)) 0x100006b00 <derived::~derived()>
(gdb) p d._vptr$base[2]
$90 = (int (*)(void)) 0x100006fe0 <derived::~derived()>
(gdb) p d._vptr$base[3]
$91 = (int (*)(void)) 0x7fff87fd8058
(gdb) p d._vptr$base[4]
$92 = (int (*)(void)) 0x10000edae <typeinfo name for derived>
(gdb) p d._vptr$base[5]
$93 = (int (*)(void)) 0x10000f248 <typeinfo for base>
(gdb) p d._vptr$base[6]
$94 = (int (*)(void)) 0x0
Вывод относится к clang, скомпилированному с символами GDB.
Я не могу понять данные по 4-му / 5-му индексу.На какую информацию указывают эти 2 индекса и как она используется.Я понимаю, что у каждого компилятора есть выбор для реализации так, как они хотят.
PS: это следующий вопрос Анализ vtable в c ++"