Возможный дубликат:
Понимание записей Vtable
Использование g ++ версии 4.6.3, 64-битный компьютер. Я знаю, что компилятор может свободно реализовывать виртуальные функции так, как хочет. Я хочу знать, что здесь произошло.
Мои занятия:
#include <iostream>
class test
{
public:
virtual void func(){std::cout<<"in class test";}
};
int main()
{
test obj;
obj.func();
return 0;
}
Глядя на виртуальную таблицу, сгенерированную компилятором,
Vtable for test
test::_ZTV4test: 3u entries
0 (int (*)(...))0 (<---- what is this? )
8 (int (*)(...))(& _ZTI4test)
16 (int (*)(...))test::func
По смещению 8 это RTTI
По смещению 16 это вход для виртуальной функции.
Мой вопрос: почему есть запись для NULL со смещением 0 или другими словами, какова цель первой записи?
Постскриптум Я думал, что это может быть связано с выравниванием, но затем я добавил больше виртуальных функций, но запись RTTI все еще была по смещению 8.
Я считаю, что первая запись или запись в 0 является смещением на верхний указатель.
Увидеть следующий важный вопрос
Просматривая остаток -fdump-class-иерархию из вашего исходного кода, большинство классов, кажется, имеют первую запись как (int (*)(...))0
единственные классы, которые не имеют его в качестве первой записи, имеют его в качестве второй и имеют первую запись в качестве смещения для родительского класса, учитывая иерархию классов C ++ STL для потоков.
В соответствующем вопросе дается мертвая ссылка на некоторые примеры из Vtable, я думаю, что доступна живая версия этой ссылки Вот
Еще один полезный ресурс, подробно описывающий структуру vtables, Вот.
Других решений пока нет …