Теория и реализация языков программирования

       

Виртуальные базовые классы


К описателю базового класса можно добавить ключевое слово virtual. В этом случае единственный подобъект виртуального базового класса разделяется каждым базовым классом, в котором тот, исходный, базовый класс определен как виртуальный.

Пусть мы имеем следующую иерархию наследования:

class L {. . . } class A : public virtual L {. . . } class B : public virtual L {. . . } class C : public A, public B {. . . }

Это можно изобразить следующей диаграммой классов:


Рис. 9.15.  Диаграмма классов

Каждый объект A или объект B будет содержать L, но в объекте C будет существовать лишь один объект класса L. Ясно, что представление объекта виртуального базового класса L не может быть в одной и той же позиции относительно и A, и B для всех объектов. Следовательно, во всех объектах классов, которые включают класс L как виртуальный базовый класс, должен храниться указатель на L. Реализация A, B и C объектов могла бы выглядеть следующим образом:


Рис. 9.16.  Реализация A, B и C объектов



Содержание раздела