Студопедия

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

Разделы сайта

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






Листинг. 13.6. Пример использования виртуального наследования






1: // Листинг 13.6.

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

3: #include < iostream.h>

4:

5: typedef int HANDS;

6: enum COLOR { Red, Green, Blue, Yellow, White, Black, Brown };

7:

8: class Animal // общий базовый класс для двух производных классов horse и bird

9: {

10: public:

11: Animal(int);

12: virtual ~Animal() { cout < < " Animal destructor...\n"; }

13: virtual int GetAge() const { return itsAge; }

14: virtual void SetAge(int age) { itsAge = age;)

15: private:

16: int itsAge;

17: };

18:

19: Animal:: Animal(int age):

20: itsAge(age)

21: {

22: cout < < " Animal constructor...\n";

23: }

24:

25: class Horse: virtual public Animal

26: {

27: public:

28: Horse(C0L0R color, HANDS height, int age);

29: virtual ^Horse() { cout < < " Horse destructor...\n"; }

30: virtual void Whinny()const { cout < < " Whinny!... "; }

31: virtual HANDS GetHeight() const { return itsHeight; }

32: virtual COLOR GetColor() const { return itsColor; }

33: protected:

34: HANDS itsHeight;

35: COLOR itsColor;

36: };

37:

38: Horse:: Horse(C0L0R color, HANDS height, intage):

39: Animal(age),

40: itsColor(color), itsHeight(height)

41: {

42: cout < < " Horse constructor...\n";

43: }

44:

45: class Bird: virtual public Animal

46: {

47: public:

48: Bird(COLOR color, bool migrates, int age);

49: virtual ~Bird() { cout < < " Bird destructor...\n"; }

50: virtual void Chirp()const { cout < < " Chirp... "; }

51: virtual void Fly()const

52: { cout < < " I can fly! I can fly! I can fly! "; }

53: virtual COLOR GetColor()const { return itsColor; }

54: virtual bool GetMigration() const { return itsMigration; }

55: protected:

56: COLOR itsColor;

57: bool itsMigration;

58: };

59:

60: Bird;: Bird(COLOR color, bool migrates, int age):

61: Animal(age),

62: itsColor(color), itsMigration(migrates)

63: {

64: cout < < " Bird constructor...\n";

65: }

66:

67: class Pegasus: public Horse, public Bird

68: {

69: public:

70: void Chirp()const { Whinny(); }

71: Pegasus(COLOR, HANDS, bool, long, int);

72: virtual ~Pegasus() { cout < < " Pegasus destructor...\n"; }

73: virtual long GetNumberBelievers() const

74: { return itsNumberBelievers; }

75: virtual COLOR GetColor()const { return Horse:: itsColor; }

76: private:

77: long itsNumberBelievers;

78: };

79:

80: Pegasus:: Pegasus(

81: COLOR aColor,

82: HANDS heigbt,

83: bool migrates,

84: long NumBelieve,

85: int age):

86: Horse(aColor, height, age),

87: Bird(aColor, migrates, age),

88: Animal(age*2),

89: itsNumberBelievers(NumBelieve)

90: {

91: cout < < " Pegasus constructor...\n";

92: }

93:

94: int main()

95: {

96: Pegasus *pPeg = new Pegasus(Red, 5, true, 10, 2);

97: int age = pPeg-> GetAge();

98: cout < < " This pegasus is " < < age < < " years old.\n";

99: delete pPeg:

100: return 0;

101: }

 

Результат:

Animal constructor...

Horse constructor...

Bird constructor...

Pegasus constructor...

Tnis pegasus is 4 years old.

Pegasus destructor...

Bird destructor...

Horse destructor...

Animal destructor...

 

Анализ: В строке 25 класс Horse виртуально наследуется от класса Animal, а в строке 45 так же наследуется класс Bird. Обратите внимание, что конструкторы обоих классов по-прежнему инициализируют класс Animal. Но как только создается объект Pegasus, конструктор этого класса заново инициализирует класс Animal, отменяя прежние инициализации. Убедиться в этом вы можете по результату, выводимому программой на экран. При первой инициализации переменной itsAge присваивается значение 2, но конструктор класса Pegasus удваивает это значение. В результате строка 98 программы выводит на экран значение 4.

Проблемы с неопределенностью наследования метода в классе Pegasus больше не возникает, поскольку теперь метод GetAge() наследуется непосредственно из класса Animal. В то же время при обращении к методу GetColor() по-прежнему необходимо явно указывать базовый класс, так как этот метод объявлен в обоих классах, Horse и Bird.

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.