|
|
Класс может быть производным по отношению к любому числу базовых классов. Приведем пример:
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.
| |