Объяснение виртуальной диспетчеризации для кого-то легко: каждый объект имеет указатель на таблицу как часть своих данных. В классе есть N виртуальных методов. Каждый вызов определенного метода я индексирует объект, когда он прибывает, и вызывает i-й метод в таблице. Каждый класс, реализующий метод X(), будет иметь код для метода X() в том же i-м индексе.
Но тогда мы получаем интерфейсы. И интерфейсы требуют какого-то искажения, потому что два не наследующих класса, которые реализуют один и тот же интерфейс, будут иметь виртуальные функции в разных индексах таблицы.
Я искал Интернет, и есть много дискуссий, которые я могу найти о том, как можно реализовать интерфейсную диспетчеризацию. Существуют две широкие категории: a) какая-то хэш-таблица ищет объект для поиска нужной таблицы отправки б) когда объект передается на интерфейс, создается новый указатель, который указывает на одни и те же данные, но на другую таблицу vtable.
Но, несмотря на много информации о том, как он может работать, я не могу найти ничего о том, как его работает.
Кто-нибудь знает документ, который описывает фактическую арифметику указателя, которая происходит в команде callvirt, когда тип объекта является интерфейсом?