logo
volkov / C++ / Бьерн Страуструп-Справочное руководство по С++

R.10.1 Множественные базовые классы

Класс может быть производным по отношению к любому числу базовых

классов. Приведем пример:

class A { /* ... */ };

class B { /* ... */ };

class C { /* ... */ };

class D : public A, public B, public C { /* ... */ };

Использование более, чем одного прямого базового класса называется

множественным наследованием.

Порядок наследования не важен, если не учитывать вопросов,

связанных со стандартной инициализацией с помощью конструктора

($$R.12.1), уничтожением ($$R.12.4) и размещением в памяти

($$r.5.4, $$R.9.2, $$R.11.1). Порядок выделения памяти для базовых

классов определяется реализацией.

Нельзя указывать класс в качестве прямого базового по отношению

к производному классу более одного раза, но косвенным базовым классом

он может быть неоднократно.

class B { /* ... */ };

class D : public B, public B { /* ... */ }; // недопустимо

class L { /* ... */ };

class A : public L { /* ... */ };

class B : public L { /* ... */ };

class C : public A, public B { /* ... */ }; // нормально

Здесь объект класса C будет иметь два вложенных объекта класса L.

К спецификации базового класса можно добавить служебное слово

virtual. Отдельный объект виртуального базового класса V разделяется

между всеми базовыми классами, которые указали V при задании своих

базовых классов. Приведем пример:

class V { /* ... */ };

class A : virtual public V { /* ... */ };

class B : virtual public V { /* ... */ };

class C : public A, public B { /* ... */ };

Здесь объект класса C будет иметь только один вложенный объект

класса V.

Класс может содержать виртуальные и невиртуальные базовые классы одного

типа, например:

class B { /* ... */ };

class X : virtual public B { /* ... */ };

class Y : virtual public B { /* ... */ };

class Z : public B { /* ... */ };

class AA : public X, public Y, public Z { /* ... */ };

Здесь объект класса AA будет иметь два вложенных объекта класса B:

из класса Z и виртуальный, разделяемый между классами X и Y.