Действительно ценю концептуальное объяснение.
Виртуальное наследование реализуется по-разному в зависимости от компилятора.
1) Да, и vc, и gcc используют указатель vTable. Но у vc есть другой указатель ref как указатель виртуальной базы.
2) Для классического виртуального наследования, такого как левый < Верхний; Правильно < Верхний; Низ < Лево и право
Стек должен быть таким:
Left.vptr // -> to its vtable
Left::element_in_left
Right.vptr
Right::element_in_right
Bottom::element_in_bottom
Top::element_in_top
Программы используют vptr для поиска vtable, для gcc в viable есть значение виртуального базового смещения. vptr + base смещение даст родительский адрес.
3) Я не уверен, что ты имеешь в виду. Есть разные способы реализовать это в компиляторах C ++. И другие языки имеют свои способы привязки функций.
Других решений пока нет …