C++ vtable в множественном наследовании, указатель на метод thunk

Я прочитал эту статью: https://shaharmike.com/cpp/vtable-part2/

И я не могу понять, почему в vtable (в конце статьи) у нас есть такой указатель:

0x400918 0x400820 не виртуальный Thunk для Child::FatherFoo()

но не указатель непосредственно на метод Child::FatherFoo()?

Я предполагаю, что vtable ребенка полностью отделен от vtable отца.

1 ответ

Точно так же, как все, кроме одного члена структуры C, не могут иметь тот же адрес, что и охватывающий объект, все, кроме одного непустого подобъекта базового класса, не могут иметь тот же адрес, что и полный объект; полиморфный базовый класс (класс с виртуальными функциями) не пуст по определению.

Подобъект полиморфного основания, имеющий тот же адрес, что и производный объект, называется первичным основанием. Производный объект разделяет базу макета vtable и vptr с первичной базой: неявная this параметр не изменяется

Примечание. Концепция первичной базы - это концепция домена реализации C++ (например, vtable, vptr...), а не концепция языка C++ (например, базовый класс, виртуальная функция...). Так что, очевидно, это не описано в стандарте C++.

Когда виртуальная функция вызывается динамически через механизм виртуального вызова для объекта неизвестного динамического типа, this неявный аргумент должен быть скорректирован на правильное значение, которое является другим значением неосновных оснований. Посредник, который делает это, называется thunk. В этом случае блок может выполнить переход, а не вызов функции, к правильной функции: дополнительная работа происходит при вводе функции, и при выходе из функции ничего не требуется.

Другой тип корректировки происходит, когда используется ковариантный тип возврата, а производное отношение к основанию ковариантного возврата не является производным к первичному базовому отношению. Очевидно, что этот вид thunk не делает прыжок, он выполняет вызов функции, так как корректировка ковариации происходит при выходе из функции.

Другие вопросы по тегам