Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Объектно-ориентированное программирование на C++.pdf
Скачиваний:
61
Добавлен:
23.03.2016
Размер:
1.88 Mб
Скачать

Базовые

сведения

Введение

Ссылки

Классы

Поля и методы

Конструкторы

Создание и уничтожение объектов Копирование

объектов

Одиночное

наследование

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

Обобщённое

программирова-

ние

Перегрузка

операций

Исключения

private- и protected-наследование

42 / 99

Наследование от нескольких базовых классов

Базовые

сведения

Введение

Ссылки

Классы

Поля и методы

Конструкторы

Создание и уничтожение объектов Копирование

объектов

Одиночное

наследование

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

Обобщённое

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

Перегрузка

операций

Исключения

C++ поддерживает множественное наследование. Если класс Y – производный от нескольких базовых классов X1, X2, ..., Xn, то объявление класса Y выглядит на C++ как

class Y: мод X1 , мод X2 , ... , мод Xn

{

...

};

Здесь «мод» – это public, protected или private.

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

Y :: Y (...): X1 (...) , X2 (...) ,

... ,

Xn (...) {

...

}

43 / 99

 

Иерархия наследования и классы противоречия

Базовые

сведения

Введение

Ссылки

Классы

Поля и методы

Конструкторы

Создание и уничтожение объектов Копирование

объектов

Одиночное

наследование

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

Обобщённое

программирова-

ние

Перегрузка

операций

Исключения

Иерархия наследования – это ориентированный ациклический граф, множеством узлов которого является множество классов программы. При этом если класс Y является непосредственным базовым классом для класса X, то из узла X исходит дуга, входящая в Y.

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

Иерархия наследования называется противоречивой, если в ней существуют классы противоречия.

44 / 99

Неоднозначности в противоречивых иерархиях

 

Базовые

 

В противоречивых иерархиях в производных классах могут

 

 

 

 

 

 

 

 

 

 

сведения

 

 

возникать два или более методов с совпадающими именами

 

Введение

 

 

Ссылки

 

и сигнатурами. То же самое справедливо и для полей.

 

 

 

 

 

 

 

 

 

 

Классы

 

Пример:

 

 

 

 

 

 

Поля и методы

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Конструкторы

1

class

A { public : virtual

void

m ()

{

}

};

 

Создание и

 

2

class

B { public : virtual

void

m ()

{

}

};

 

уничтожение

 

объектов

3

class

C: public A , public

B {

};

 

 

 

 

Копирование

4

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

объектов

int main ()

 

 

 

 

 

 

5

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Одиночное

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

наследование

6

{

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Множественное

7

C

c;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

наследование

 

 

 

 

 

 

 

 

8

c.m ();

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Обобщённое

 

 

 

 

 

 

программирова-

9

return 0;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ние

10

}

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Перегрузка

операций

g++ выдаёт ошибку в строке 8:

Исключения

error : request for member ’m ’ is ambiguous

45 / 99