Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

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



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

Примеры простого наследования (схемы иерархии классов) представлены на рис. 3.1.

а) cl1 б) cl1 в) cl1 г) cl1

| / \ | / \

cl2 cl2 cl3 cl2 cl2 cl5

| / \ |

cl3 cl3 cl4 cl6

Рис. 3.1. Примеры простого наследования

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

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

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

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

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

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

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

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

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

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’; }

}; };

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

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

cl1 cl2

\ /

cl3

Рис. 3.2. Пример множественного наследования

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

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

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

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

Доступ к элементам производного класса (собственным и наследуемым) аналогичен доступу при простом наследовании.

Неоднозначность доступа возникает в следующих случаях:

- в производном классе и в одном из базовых классов имеются элементы с одинаковыми именами;

- в базовых классах имеются элементы с одинаковыми именами.

Например, имеется элемент int tabn в классах cl1 и cl2.

Для разрешения неоднозначности нужно использовать имя базового класса с операцией разрешения видимости (например, obj3.cl1::tabn=20;доступ к tabn в cl1).

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

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

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

Пусть имеется схема иерархии классов (рис. 3.3).

cl1

/ \

cl2 cl3

\ /

cl4

Рис. 3.3. Схема иерархии классов

Объект obj4 класса cl4 имеет в памяти следующие части:

- элементы, унаследованные неявно от cl1 по левой ветви;

- элементы, унаследованные явно от cl2;

- элементы, унаследованные неявно от cl1 по правой ветви;

- элементы, унаследованные явно от cl3;

- собственные элементы класса cl4.

Объект класса cl4 содержит две копии элементов класса cl1, унаследованных неявно по левой и по правой ветвям. Возникает неопределенность при доступе к наследуемым элементам класса cl1 внутри класса cl4 или через объект класса cl4. Например, доступ к элементу tabn класса cl1 с помощью выражения obj4.tabn не верен. Для устранения необходимо указать путь (ветвь) наследования, т.е. имя базового класса соответствующей ветви с операцией разрешения видимости. Например, для доступа к tabn, унаследованной по левой ветви, необходимо выражение obj4.cl2::tabn, аналогично по правой ветви - obj4.cl3::tabn.

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

Базовый класс объявлен непосредственно в определении производного класса только 1 раз. Нельзя объявлять явно cl1 в cl4, так как cl1 уже объявлен в cl4 неявно через cl2 и cl3.

Для устранения неоднозначности можно заменить явное наследование класса cl1 на неявное, добавив пустой класс cl5 между cl1 и cl4. Изменение схемы иерархии классов - на рис. 3.4.

cl1 cl1

/ | \ / | \

cl2 cl3 | cl2 cl3 cl5

\ | / \ | /

cl4 cl4

Рис. 3.4. Изменение схемы иерархии классов





Дата публикования: 2014-11-26; Прочитано: 418 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.008 с)...