Чтение онлайн

на главную - закладки

Жанры

Освой самостоятельно С++ за 21 день.

Либерти Джесс

Шрифт:

1: // Листинг 13.3. Множественное наследование.

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

3:

4: #include <iostream.h>

5:

6: class Horse

7: {

8: public:

9: Horse { cout << "Horse constructor... "; }

10: virtual ~Horse { cout << "Horse destructor... "; }

11: virtual void Whinny const { cout << "Whinny!... "; }

12: private:

13: int itsAge;

14: };

15:

16: class Bird

17: {

18: public:

19: Bird { cout << "Bird constructor... "; }

20: virtual ~Bird { cout << "Bird destructor... "; }

21: virtual void Chirp const { cout << "Chirp... "; }

22: virtual void Fly const

23: {

24: cout << "I can fly! I can fly! I can fly! ";

25: }

26: private:

27: int itsWeight;

28: };

29:

30: class Pegasus : public Horse, public Bird

31: {

32: public:

33: void Chirp const { Whinny; }

34: Pegasus { cout << "Pegasus constructor... "; }

35: ~Pegasus { cout << "Pegasus destructor... "; }

36: };

37:

38: const int MagicNumber = 2;

39: int main

40: {

41: Horse* Ranch[MagicNumber];

42: Bird* Aviary[MagicNumber];

43: Horse * pHorse;

44: Bird * pBird;

45: int choice,i;

46: for (i=0; i<MagicNumber; i++)

47: {

48: cout << "\n(1)Horse (2)Pegasus: ";

49: cin >> choice;

50: if (choice == 2)

51: pHorse = new Pegasus;

52: else

53: pHorse = new Horse;

54: Ranch[i] = pHorse;

55: }

56: for (i=0; i<MagicNumber; i++)

57: {

58: cout << "\n(1)Bird (2)Pegasus: ";

59: cin >> choice;

60: if (choice == 2)

61: pBird = new Pegasus;

62: else 

63: pBird = new Bird; 

64: Aviary[i] = pBird; 

65: } 

66: 

67: cout << "\n"; 

68: for (i=0; i<MagicNumber; i++)

69: { 

70: cout << "\nRanch[" << i << "]:

71: Ranch[i]->Whinny; 

72: delete Ranch[i]; 

73: } 

74: 

75: for (i=0; i<MagicNumber; i++)

76: { 

77: cout << "\nAviary[" << i << "]

78: Aviary[i]->Chirp; 

79: Aviary[i]->Fly; 

80: delete Aviary[i]; 

81: } 

82: return 0; 

83: } 

Результат:

(1)Horse (2)Pegasus: 1

Horse constructor...

(1)Horse (2)Pegasus: 2

Horse constructor... Bird constructor... Pegasus constructor...

(1)Bird (2)Pegasus: 1

Bird constructor...

(1)6ird (2)Pegasus: 2

Horse constructor... Bird constructor... Pegasus constructor...

Ranch[0]: Whinny!... Horse destructor...

Ranch[1]: Whinny!... Pegasus destructor... Bird destructor...

Horse destructor...

Aviary[0]: Chirp... I can fly! I can fly! I can fly! Bird destructor...

Aviary[1]: Whinny!... I can fly! I can fly! I can fly!

Pegasus destructor... Bird destructor... Horse destructor...

Анализ:

В строках 6—14 объявляется класс Horse. Конструктор и деструктор выводят на экран сообщения о своей работе, а метод Whinny печатает Whinny! (И-го-го).

Класс Bird объявляется в строках 16—28. В дополнение к своим конструктору и деструктору этот класс содержит два метода: Chirp и Fly, каждый из которых выводит на экран соответствующие сообщения. В реальных программах эти методы могут воспроизводить определенный звуковой файл или управлять анимационными эффектами на экране.

Наконец, в строках 30-36 объявляется класс Pegasus. Он производится сразу от двух базовых классов — Bird и Horse. В классе замешается метод Chirp таким образом, что вызывается метод Whinny, который унаследован этим классом от класса Horse.

Создается два списка: Ranch (конюшня), который в строке 41 связывается с классом Horse, и Aviary (птичник), который в строке 42 связывается с классом Bird. В строках 46—55 в список Ranch добавляются два объекта — Horse и Pegasus. В строках 56—65 в список Aviary добавляются объекты Bird и Pegasus.

Вызовы виртуальных методов с помощью указателей классов Bird и Horse одинаково выполняются для объекта Pegasus. Например, в строке 78 метод Chirp вызывается последовательно для всех объектов, указатели на которые представлены в массиве Aviary. Поскольку этот метод объявлен в классе Bird как виртуальный, он правильно Выполняется для всех объектов списка.

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

Объявление множественного наследования

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

Поделиться:
Популярные книги

Я еще князь. Книга XX

Дрейк Сириус
20. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще князь. Книга XX

Загадки Лисы

Началова Екатерина
3. Дочь Скорпиона
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Загадки Лисы

Седьмой Рубеж II

Бор Жорж
2. 5000 лет темноты
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Седьмой Рубеж II

Сумеречный стрелок 8

Карелин Сергей Витальевич
8. Сумеречный стрелок
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Сумеречный стрелок 8

Возвышение Меркурия. Книга 5

Кронос Александр
5. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 5

Волков. Гимназия №6

Пылаев Валерий
1. Волков
Фантастика:
попаданцы
альтернативная история
аниме
7.00
рейтинг книги
Волков. Гимназия №6

Барон не признает правила

Ренгач Евгений
12. Закон сильного
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Барон не признает правила

"Фантастика 2023-126". Компиляция. Книги 1-22

Руденко Борис Антонович
Фантастика 2023. Компиляция
Фантастика:
фэнтези
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Фантастика 2023-126. Компиляция. Книги 1-22

Тигр под елку

Зайцева Мария
4. Наша
Любовные романы:
короткие любовные романы
5.00
рейтинг книги
Тигр под елку

Мастер Разума V

Кронос Александр
5. Мастер Разума
Фантастика:
городское фэнтези
попаданцы
5.00
рейтинг книги
Мастер Разума V

Пушкарь. Пенталогия

Корчевский Юрий Григорьевич
Фантастика:
альтернативная история
8.11
рейтинг книги
Пушкарь. Пенталогия

Настроение – Песец

Видум Инди
7. Под знаком Песца
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Настроение – Песец

Метатель

Тарасов Ник
1. Метатель
Фантастика:
боевая фантастика
попаданцы
рпг
фэнтези
фантастика: прочее
постапокалипсис
5.00
рейтинг книги
Метатель

Пепел и кровь

Шебалин Дмитрий Васильевич
4. Чужие интересы
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Пепел и кровь