В стандарте C ++ нет ничего, что предписывало бы конкретную реализацию виртуального наследования. Семантика виртуального наследования указывается в терминах соответствующего синтаксиса и ожидаемых результатов . Реализации C ++ могут свободно использовать любую техническую реализацию, которая дает такие результаты.
Например, давайте начнем с виртуального наследования целых базовых классов:
[class.mi]
Спецификатор базового класса, который содержит ключевое слово virtual, определяет виртуальный базовый класс. ... Для каждого отдельного базового класса, который указан виртуальный, наиболее производный объект должен содержать один подобъект базового класса этого типа.
Стандарт определяет синтаксис virtual
как введение виртуального наследования базовый класс и ожидаемый результат: наиболее производный объект содержит один экземпляр виртуально унаследованного базового класса. Полная остановка. Конец истории. Как конкретная реализация делает это, выходит за рамки стандарта.
Аналогично для отдельных виртуальных функций:
[class.virtual]
Если виртуальная функция-член vf объявлена в классе Base и в классе Derived, полученном прямо или косвенно из Base ... [еще несколько требований] ... тогда Derived :: vf ... переопределяет Base :: vf.
Некоторые технические требования опущены. Стандарт просто указывает, что виртуальная функция в производном классе «переопределяет» (ту же) функцию в базовом классе. Как конкретная реализация C ++ делает это, нигде не указано.