Ниже мы определили базовый класс Base, содержащий несколько элементов, а затем наследовали от него два новых класса DerivedFirst и DerivedSecond. В каждом из порожденных классов мы определили различные дополнительные методы и элементы данных.

// Класс Base

class Base {

 // Элементы класса Base

};

// Класс DerivedFirst, наследованный от базового класса Base

class DerivedFirst : Base {

 // Элементы класса DerivedFirst

};

// Класс DerivedSecond, наследованный от базового класса Base

class DerivedSecond : Base {

 // Элементы класса DerivedSecond

};

Классы DerivedFirst и DerivedSecond сами могут выступать в качестве базовых классов.

Вы можете определять в пороженном классе элементы, имена которых совпадают с именами элементов базовых классов. Если вы выполнили такое переопределение, вы можете обратиться к элементу базового класса, если укажете его полное имя. Полное имя должно состоять из имени класса, к которому относится элемент, оператора :: и имени самого элемента.

В качестве примера приведем базовый класс Base и производный от него класс Derived. В обоих классах определен элемент данных iNumber. Чтобы получить доступ из порожденного класса к элементу iNumber базового класса указывается его полное имя Base::iNumber.

// Класс Base

class Base {

public:

 int iNumber;

 // Другие элементы класса

};

// Класс Derived, наследованный от базового класса Base

class Derived : Base {

public:

 // Это объявление скрывает элемент iNumber базового класса

 int iNumber;

 int GetNumber(void) { return iNumber + Base::iNumber; }

};

Указатель на объект базового класса можно присвоить указатель на объект класса порожденного от него. Эта возможность будет широко использоваться в библиотеке классов MFC.

<p>Множественное наследование</p>

Множественное наследование выполняется подобно единичному наследованию. В отличие от единичного наследования у порожденного класса может быть несколько базовых классов. На рисунке 1.2 представлен пример множественного наследования классов. Класс DerivedClaass имеет два базовых класса BaseClassOne и BaseClassSecond. Класс DerivedClaass и еще один класс BaseClass используются при множественном наследовании класса DerivedClaassSecond.

Рис. 1.2. Множественное наследование

Вместо имени единственного базового класса указывается список имен базовых классов, разделенный запятыми. Непосредственно перед названиями базовых классов могут быть указаны спецификаторы доступа public, private и protect. Их назначение мы рассмотрим в разделе “Разграничение доступа к элементам базового класса”.

class [[:[]]

{

} [];

Порядок, в котором вы перечислите базовые классы влияет только на последовательность в которой вызываются конструкторы и деструкторы базовых классов. Конструкторы базовых классов вызываются в том порядке, в котором они перечислены (слева на право). Деструкторы базовых классов вызываются в обратном порядке.

Один и тот же класс нельзя указывать два или более раза в качестве базового класса (за исключением тех случаев, когда он является непрямым базовым классом).

В следующем примере определены два базовых класса BaseFirst и BaseSecond. От них наследован один новый класс Derived. Результирующий класс Derived объединяет элементы обоих базовых классов и добавляет к ним собственные элементы.

// Класс BaseFirst

class BaseFirst {

// Элементы класса BaseFirst

};

// Класс BaseSecond

class BaseSecond {

// Элементы класса BaseSecond

};

// Класс Derived, наследованный от базового класса Base

class Derived : BaseFirst, BaseSecond {

// Элементы класса Derived

};

Так как библиотека классов MFC не использует множественное наследование, мы не станем останавливаться на нем более подробно. При необходимости вы можете получить дополнительную информацию из справочников или учебников по языку Си++ (см. список литературы).

<p>Разграничение доступа к элементам базового класса</p>
Перейти на страницу:

Все книги серии Библиотека системного программиста

Похожие книги