Студопедия

Главная страница Случайная страница

КАТЕГОРИИ:

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






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, для чего деструкторы в этих классах объявлены как виртуальные.

 


Поделиться с друзьями:

mylektsii.su - Мои Лекции - 2015-2024 год. (0.009 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал