Студопедия

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

КАТЕГОРИИ:

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






Листинг 13.5. Общий базовый класс






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

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: public Animal

26: {

27: public:

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

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

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

31: virtual HANOS 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, int age):

39: Animal(age),

40: itsColor(color), itsHeight(height)

41: {

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

43: }

44:

45: class Bird: 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 C0L0R 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: virtual int GetAge() const { return Horse:: GetAge(); }

77: private:

78: long itsNumberBelievers;

79: };

80:

81: Pegasus:: Pegasus(

82: COLOR aColor,

83: HANDS height,

84: bool migrates,

85: long NumBelieve,

86: int age):

87: Horse(aColor, height, age),

88: Bird(aColor, migrates, age),

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...

Animal constructor...

Bird constructor...

Pegasus constructor...

This pegasus is 2 years old.

Pegasus destructor.,.

Bird destructor...

Animal destructor...

Horse destructor...

Animal destructor...

 

Анализ: В листинге содержится ряд интересных решений. Так, в строках 8—17 объявляется новый класс Animal с переменной-членом itsAge и двумя методами — GetAge() и SetAge().

В строке 25 класс Horse производится от класса Animal. Конструктор класса Horse теперь имеет третий параметр age, который передается в базовый класс Animal. Обратите внимание, что в классе Horse метод GetAge() не замещается, а просто наследуется.

В строке 46 класс Bird производится от класса Animal. Конструктор этого класса также содержит параметр age, с помощью которого инициализируется базовый класс Animal. Метод GetAge() также наследуется этим классом без замещения.

Класс Pegasus производится от двух базовых классов Horse и Bird, поэтому с исходным базовым классом Animal он связан двумя линиями наследования. Если для объекта класса Animal будет вызван метод GetAge(), то для преодоления неопределенности нужно точно указать, к какому базовому классу следует обращаться за этим методом, либо метод GetAge() следует заместить в классе Pegasus.

В нашем примере программы метод GetAge() замещается для класса Pegasus таким образом, что в нем явно указывается обращение к аналогичному методу конкретного базового класса.

Замещение функции с добавлением обращения к методу базового класса позволяет решить две проблемы. Во-первых, преодолевается неопределенность обращения к базовым классам; во-вторых, функцию можно заместить таким образом, что в производном классе при обращении к этой функции будут выполняться дополнительные операции, которых не было в базовом классе. Причем по желанию программиста эти дополнительные операции могут выполняться до вызова функции базового класса или после вызова с использованием значения, возвращенного функцией базового класса.

Конструктор класса Pegasus принимает пять параметров: цвет крылатого коня, его рост (в футах); логическую переменную, которая определяет, мигрирует сейчас это животное или мирно пасется на пастбище; число людей, верящих в существование Пегаса,

и возраст животного. В строке 87 конструктор инициализирует переменные, определенные в классе Horse (цвет, рост и возраст). В следующей строке инициализируется часть, относящаяся к классу Bird: цвет, миграции и возраст. Наконец, в строке 89 инициализируется переменная itsNumberBelievers, относящаяся непосредственно к классу Pegasus.

Вызов конструктора класса Horse в строке 87 выполняет операторы, записанные в строке 38. С помощью параметра age конструктор класса Horse инициализирует переменную itsAge, унаследованную классом Horse от класса Animal. Затем инициализируются две переменные-члена класса Horse — itsColor и itsHeight.

Вызов конструктора класса Bird в строке 88 выполняет операторы, записанные в строке 60. И в данном случае параметр age используется для инициализации переменной-члена, унаследованной классом Bird от класса Animal.

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

 


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

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