R Справочное руководство по С++

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.


Назад  |  Вперёд


OtDiatlovaOU
К началу книги

Оформление и дизайн книги OtDiatlovaOU.
Вся книга, архив.