Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
лек_3_слайды.doc
Скачиваний:
1
Добавлен:
17.11.2019
Размер:
457.73 Кб
Скачать

Объектно-ориентированное

программирование

Простое наследование

Простое наследование описывает родство между двумя классами, один из которых наследует второй (рис. 3.1).

Класс, находящийся на вершине иерархии, называется базовым классом. Прочие классы называются производными классами.

Рис.3.1. Простое наследование

Из одного базового класса могут выводиться многие классы.

множественное наследование - один класс может наследовать несколько базовых классов.

Рис. 3.2. несколько классов,

производных от одного базового класса

Производный класс и сам может быть базовым; которые наследуют другие классы.

Не смотря на очевидную сложность иерархии классов, изображения на рис. 3.3, все продемонстрированные взаимосвязи используют простое наследование, поскольку каждый производный класс имеет лишь одного родителя.

Не существует каких-либо ограничений на число классов, наследующих друг друга.

Вы можете строить одни классы на основе других до тех пор, пока вам это не надоест.

Рис. 3.3. Производный класс может

Быть базовым классом других

производных классов

Производный класс наследует из базового данные-члены и функции-члены, но не конструкторы и деструкторы.

Пример: на рис. 3.3 производный класс А наследует свойства базового класса в вершине иерархии. Производный класс В наследует кроме этого и новые свойства класса А. Производный класс С наследует свойства верхнего базового класса и производных классов А и В.

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

Объявление производных классов

ПРИМЕР механизма наследования:

//базовый класс ТBase

class TBase {

private:

Int count;

// закрытые данные класса

public:

//Конструктор по умолчанию

TBase () { count=0; }

//встраиваемые функции-члены

Void SetCount ( int n)

{ count=n }

Int GetCount(void)

{ return count; }

};

Несмотря на то что члены TBase не имеют никакого практического применения, они очень похожи на те, что используются в типичных классах С++, из которых могут быть выведены новые классы.

Члены count содержит закрытые данные класса. Только закрытые функции-члены TBase могут непосредственно ссылаться на count. Конструктор по умолчанию TBase () инициализирует count нулевым значением. Функция-член SetCount()присваивает count новое значение. Функция-член GetCount() возвращает текущее значение count. Для упрощения кода конструктор TBase и две функции должны быть встраиваемыми, не требующими, не требующими отдельной реализации.

Предположим, необходим новый класс, имеющий все свойство TBase, но, кроме того, способный увеличивать и уменьшать значение объекта на заданную величину.

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

сlass TDerived: public TBase {

public:

//конструктор производного класса //TDerived() и вызывается //конструктора базового класса

TDerived(): TBase() { }

Void changCount(int n)

{SetCount(GetCount() + n ); }

};

Производный класс назван TDerived. Сразу за именем класса следует двоеточие и одно из ключевых слов public, protected или private. После этих элементов следует имя базового класса (TBase), от которого TDerived получает наследство, на рис. 3.4 иллюстрируется структура класса TDerived и его конструктора.

Рис. 3.4. Структура производного класса

Открытые члены открытого класса остаются открытыми в производном классе.

Вы можете объявить производный класс следующим образом:

ПРИМЕР

class TDerived: public TBase {

//все открытые члены TBase //становится открытыми членами в //TDerived.

//Все закрытые члены TBase //остаются закрытыми в своем //первоначально объявленном классе, //и в TDerived нельзя получить //доступ к этим членам TBase.

Вы также можете объявить базовый класс закрытым:

ПРИМЕР

class TDerived : private TBase {

//все открытые члены TBase //становятся закрытыми членами в //TDerived.

//Последующие наследования //TDerived не смогут получить //доступ к любым членам TBase.

Позже вы ознакомитесь с третьим типом спецификатора класса – protected.

Использование конструктов производного класса

Ознакомимся подобнее с конструктором класса TDerive – TDerive().

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

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

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

в TDerived в строке

TDerived(): TBase() {}

объявится конструктор производного класса TDerived() и вызывается конструктора базового класса с помощью специальных обозначений TBase().

НЕльзя вызвать конструкторы базового классов в операторах; надо вызвать их, указывая их имена вслед за объявлением конструктора производного класса.

ПРИМЕР: новый конструктор TDerived не выполняет никаких действий и, соответственно, определен пустой встраиваемой функцией с пустой парой скобок.

Но в конструкторе могут выполняться операторы, в таком случае конструктор TDerived можно объявить встраиваемым следующим образом:

1)

TDerived(): TBase()

{ cout << “I am being

initialized\n”; }

Конечно, вы не обязаны реализовать конструкторы производных классов страиваемыми и можете также объявить TDerived() следующим образом:

Или

2)

сlass TDerived: public TBase {

Public:

TDerived();

// Конструктор производного класса

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]