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

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

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

Примеры простого наследования - схемы иерархии классов:

Рис. 2.1. Пример иерархических структур классов

Рассмотрим схему г). Пусть объявлен объект производного класса cl2: cl2 obj2;. тогда он будет иметь две части в памяти:

  • элементы, унаследованные от cl1 (явное наследование);

  • собственные элементы класса cl2.

Аналогично объект класса cl5 будет иметь две части.

Пусть объявлен объект производного класса cl3: cl3 obj3;. Он будет уже иметь три части, т.е.:

  • элементы, унаследованные от cl1 (неявное наследование);

  • элементы, унаследованные от cl2 (явное наследование);

  • собственные элементы класса cl3.

Аналогично объекты классов cl4 и cl6 будут иметь три части. Возникает вопрос о доступе внутри производного класса к элементам этих частей, т.е. к собственным и наследуемым элементам. Доступ к собственным элементам осуществляется прямо по имени элемента. Хотя производный класс наследует все элементы базового класса, возможность доступа к наследуемым элементам управляется атрибутом наследования (см. схему выше). Если доступ возможен, то он производится прямо по имени элемента базового класса.

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

Пример:

class cl1 class cl2: public cl1

{ {

public: int tabn;

int tabn; void f()

... {

}; tabn=10; //доступ к собств. элементу

cl1::tabn=20;//доступ к наслед. элементу

};

Конструктор производного класса выполняет следующее:

  • инициализирует собственные элементы;

  • инициализирует наследуемые элементы.

Производный класс может явно инициализировать наследуемые элементы только непосредственного базового класса. Для этого в списке инициализации конструктора производного класса должен быть явно указан прототип конструктора непосредственного базового класса. Таким образом, конструктор производного класса может содержать параметры для самого конструктора производного класса, так и параметры для конструктора базового класса.

Пример:

class index class akt:public index

{ {

protected: protected: char tabn[10]; char* imf;

int max; char tabn[10];

public: char* imf;

index(int mk):max(mk) public:

{} akt(char* imf,int m):imf(im),index(m)

... {tabn[0]=’\0’; }

}; };

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

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