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

Разрешение неоднозначностей

Базовые

сведения

Введение

Ссылки

Классы

В C++ для разрешения неоднозначности необходимо использовать квалифицированное имя метода.

Пример:

Поля и методы

1

class

A { public : virtual

void

m ()

{

}

};

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

2

class

B { public : virtual

void

m ()

{

}

};

Создание и

3

class

C: public A , public

B {

};

 

 

 

уничтожение

 

 

 

 

 

 

 

 

 

 

 

объектов

4

 

 

 

 

 

 

 

Копирование

5

int main ()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

объектов

6

{

 

 

 

 

 

 

 

 

 

 

 

 

 

Одиночное

 

 

 

 

 

 

 

 

C

c;

 

 

 

 

 

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

7

 

 

 

 

 

 

 

 

 

 

 

 

 

 

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

8

c.A :: m ();

 

 

 

 

 

 

 

 

 

 

 

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

 

 

 

 

 

9

return 0;

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Обобщённое

10

}

 

 

 

 

 

 

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

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

ние

Перегрузка

операций

Исключения

46 / 99

Основная проблема противоречивых иерархий

Базовые

 

Основной проблемой противоречивых иерархий являет-

сведения

 

 

ся возможность многократного включения полей базового

Введение

 

Ссылки

 

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

Классы

 

 

Пример:

Поля и методы

 

 

 

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

1

class A

Создание и

2

{

уничтожение

объектов

3

private :

Копирование

4

int x;

объектов

Одиночное

5

};

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

6

class B: public A {};

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

 

class C: public A {};

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

7

Обобщённое

8

class D: public B , public C {};

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

 

 

ние

 

Поле x будет содержаться в объекте класса D дважды.

 

 

Перегрузка

операций

Исключения

47 / 99

Виртуальное наследование

Базовые

сведения

Введение

Ссылки

Классы

Поля и методы

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

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

объектов

Одиночное

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

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

Обобщённое

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

Перегрузка

операций

Исключения

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

Если класс B виртуально наследует классу A, то говорят, что

A – виртуальный базовый класс для класса B. Синтаксиче-

ски это выражается как

class B: мод virtual A

{

...

};

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

48 / 99

Пример: виртуальное наследование

Базовые

1

class R

 

сведения

2

{

 

Введение

 

3

public :

 

Ссылки

 

 

int

q;

Классы

4

 

R ()

{ q = 13; }

Поля и методы

5

 

 

 

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

6

};

 

Создание и

7

 

 

 

 

 

 

 

 

 

уничтожение

8

class

A: virtual

R

{

public : void

setq ( int

x );

};

объектов

 

 

 

 

 

 

 

 

 

 

Копирование

9

class

B: virtual

R

{

public : int

getq (); };

 

 

объектов

10

class

C: public

A ,

public B {

};

 

 

 

Одиночное

 

 

 

 

 

 

 

 

 

 

 

 

 

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

11

 

 

 

 

 

 

 

 

 

Множественное 12 void A :: setq ( int x) { q = x; }

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

13 int B :: getq () { return q; }

Обобщённое

14

 

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

 

 

int main ( void )

ние

15

Перегрузка

16

{

операций

17

C c;

 

Исключения

18

c. setq (666);

 

19

cout << c. getq (); // Выведет 666

 

20

return 0;

 

21

}

 

 

49 / 99