Возьмем следующий пример:
class Base{
virtual string function1(){ return "Base - function1"; };
virtual string function2(){ return "Base - function2"; };
};
class Derived : public Base {
virtual string function2(){ return "Derived - function2"; };
virtual string function1(){ return "Derived - function1"; };
string function3() { return "Derived - function3"; };
};
Итак, структура vtable похожа на
Base-vTable
-----------------------
name_of_function address_of_function
function1 &function1
function2 &function2
-----------------------
-----------------------
Derived-vTable
-----------------------
name_of_function address_of_function
function1 &function1
function2 &function2
или похожа на
Base-vTable
-----------------------
Offset function
+0 function1
+4 function2
-----------------------
-----------------------
Derived-vTable
-----------------------
Offset function
+0 function1
+4 function2
Если она похожа на последнюю? тогда что это за смещение? где это используется?
И имя функции: Это искаженное имя функции? если оно искажено, то базовое и производное искаженные имена не будут совпадать, и поиск vtable не будет работать. Компилятор искажает все имена виртуальных функций, поэтому это должно быть искаженное имя, означает ли это, что искаженное имя для базового & производное то же самое, если это виртуальная функция.