Детали реализации виртуальной отправки

Прежде всего, я хочу прояснить, чтоЯ понимаю, что в стандарте C ++ нет понятия vtables и vptrs, Однако я думаю, что практически все реализации реализуют механизм виртуальной диспетчеризации практически одинаково (поправьте меня, если я ошибаюсь, но это не главный вопрос). Кроме того, я считаю,Я знаю как работают виртуальные функциия всегда могу сказать, какая функция будет вызвана, мне просто нужны детали реализации.

Предположим, кто-то спросил меня следующее:
«У вас есть базовый класс B с виртуальными функциями v1, v2, v3 и производный класс D: B, который переопределяет функции v1 и v3 и добавляет виртуальную функцию v4. Объясните, как работает виртуальная диспетчеризация».

Я бы ответил так:
Для каждого класса с виртуальными функциями (в данном случае B и D) у нас есть отдельный массив указателей на функции, называемый vtable.
Vtable для B будет содержать

&B::v1
&B::v2
&B::v3

Vtable для D будет содержать

&D::v1
&B::v2
&D::v3
&D::v4 

Теперь класс B содержит указатель на член vptr. D, естественно, наследует его и поэтому тоже содержит. В конструкторе и деструкторе B B устанавливает vptr для указания на vtable таблицы B. В конструкторе и деструкторе D D устанавливает его так, чтобы он указывал на виртуальную таблицу D.
Любой вызов виртуальной функции f на объекте x полиморфного класса X интерпретируется как вызов x.vptr [позиция f в vtables]

Вопросы:
1. У меня есть ошибки в приведенном выше описании?
2. Как компилятор узнает позицию f в vtable (подробно, пожалуйста)
3. Значит ли это, что если у класса есть две базы, то у него два vptr? Что происходит в этом случае? (попробуйте описать так же, как я, как можно более подробно)
4. Что происходит в алмазной иерархии с A сверху B, C посередине и D снизу? (A является виртуальным базовым классом B и C)

Заранее спасибо.

Ответы на вопрос(3)

Ваш ответ на вопрос