виртуальная таблица (vtable) - создается в статической памяти одна на тип, у которого есть виртуальные функции. в ней перечислены адреса виртуальных функций этого типа и адреса виртуальных предков при виртуальном наследовании vtable содержит чуть больше инфы о классах + иногда может случится Vtable Table Table
отличие виртуального наследования от обычного наследования полиморфных объектов: при обычном наследовании указатели на vtable складываются перед наследником, сколько виртуальных предков, столько и поинтеров перед ним при виртуальном наследовании у нас всегда поинтер один, а в vtable хранятся все сдвиги, общий предок кладётся после наследника
здесь vtable мамы и vtable папы указывают на сыновний vtable
в STL есть пример виртуального наследования: std::iostream наследуется от std::istream и std::ostream std::istream и std::ostream наследуются от std::basic_ios ромбовидное наследование
в объектах, у которых есть виртуальный предок в начале хранится указатель на виртуальную таблицу
в виртуальной таблице ещё хранится число top offset, показывающее насколько объект сдвинут относительно начала static_cast не применим при виртуальном наследовании вниз (только если это не тривиальный каст, т.е. если от предка)
если от одного объекта унаследоваться обычно и виртуально, то ошибки не будет, будет просто дублирование объекта (CE при обращении)
если по одному пути до виртуального предка метод переопределен, то метод выбирается переопределенный
при виртуальном наследовании по мере создания потомка, в момент когда конструируется родитель, то его vpointer указывает на vtable родителя. это для того, чтобы не было указателей на ещё несуществующие методы перестановка при уничтожении происходит также