виртуальная таблица (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 родителя. это для того, чтобы не было указателей на ещё несуществующие методы перестановка при уничтожении происходит также

virtual functions