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

ЖАНРЫ

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

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

Шрифт:

Листинг 13.10. Наследование класса ADT от другого класса ADT

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

2: // Deriving ADTs from other ADTs

3: #include <iostream.h>

4:

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

6:

7: class Animal // Общий базовый класс для классов Mammal и Fish

8: {

9: public:

10: Animal(int);

11: virtual ~Animal { cout << "Animal destructor...\n"; }

12: virtual int GetAge const { return itsAge; }

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

14: virtual void Sleep const = 0;

15: virtual void Eat const = 0;

16: virtual void Reproduce const = 0;

17: virtual void Move const = 0;

18: virtual void Speak const = 0;

19: private:

20: int itsAge;

21: };

22:

23: Animal::Animal(int age):

24: itsAge(age)

25: {

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

27: }

28:

29: class Mammal : public Animal

30: {

31: public:

32: Mammal(int age):Animal(age)

33: { cout << "Mammal constructor...\n";}

34: virtual ~Mammal { cout << "Mammal destructor...\n";}

35: virtual void Reproduce const

36: { cout << "Mammal reproduction depicted...\n"; }

37: };

38:

39: class Fish : public Animal

40: {

41: public:

42: Fish(int age):Animal(age)

43: { cout << "Fish constructor...\n";}

44: virtual ~Fish { cout << "Fish destructor...\n"; }

45: virtual void Sleep const { cout << "fish snoring...\n"; }

46: virtual void Eat const { cout << "fish feeding...\n"; }

47: virtual void Reproduce const

48: { cout << "fish laying eggs...\n"; }

49: virtual void Move const

50: { cout << "fish swimming...\n"; }

51: virtual void Speak const { }

52: };

53:

54: class Horse : public Mammal

55: {

56: public:

57: Horse(int age, COLOR color ):

58: Mamrnal(age), itsColor(color)

59: { cout << "Horse constructor...\n"; }

60: virtual ~Horse { cout << "Horse destructor...\n"; }

61: virtual void Speakconst { cout << "Whinny!... \n"; }

62: virtual COLOR GetItsColor const { return itsColor; }

63: virtual void Sleep const

64: { cout << "Horse snoring.,.\n"; }

65: virtual void Eat const { cout << "Horse feeding...\n"; }

66: virtual void Move const { cout << "Horse running...\n";} 67:

68: protected:

69: COLOR itsColor;

70: };

71:

72: class Dog : public Mammal

73: {

74: public:

75: Dog(int age, COLOR color ):

76: Mammal(age), itsColor(color)

77: { cout << "Dog constructor...\n"; }

78: virtual ~Dog { cout << "Dog destructor...\n"; }

79: virtual void Speakconst { cout << "Woof!... \n"; }

80: virtual void 51eep const { cout << "Dog snoring...\n"; }

81: virtual void Eat const { cout << "0og eating...\n"; }

82: virtual void Move const { cout << "Dog running...\n"; }

83: virtual void Reproduce const

84: { cout << "Dogs reproducing...\n"; }

85:

86: protected:

87: COLOR itsColor;

88: };

89:

90: int main

91: {

92: Animal *pAnimal=0;

93: int choice;

94: bool fQuit = false;

95:

96: while (1)

97: {

98: cout << "(1)Dog (2)Horse (3)Fish(0)Quit: ";

99: cin >> choice; 100:

101: switch (choice)

102: {

103: case 1: pAnimal = new Dog(5,Brown);

104: break;

105: case 2: pAnimal = new Horse(4,Black);

106: break;

107: case 3: pAnimal = new

108: break;

109: default: fQuit = true

110: break;

111: }

112: if (fQuit)

113: break;

114:

115: pAnimal->Speak;

116: pAnimal->Eat;

117: pAnimal->Reproduce;

118: pAnimal->Move;

119: pAnimal->Sleep;

120: delete pAnimal;

121: cout << "\n";

122: }

123: return 0;

124: }

Результат:

(1)Dog (2)Horse (3)Bird (0)Quit: 1

Animal constructor. . .

Mammal constructor...

Dog constructor...

Woof!...

Dog eating. . .

Dog reproducing....

Dog running...

Dog snoring...

Dog destructor...

Mammal destructor...

Animal destructor...

(1)Dog (2)Horse (3)Bird (0)Quit: 0

Анализ:

В строках 7—21 объявляется абстрактный тип данных Animal. Единственный метод этого класса, не являющийся чистой виртуальной функцией, это общий для объектов всех производных классов метод itsAge. Остальные пять методов — Sleep, Eat, Reproduce, Move и Speak — объявлены как чистые виртуальные функции.

Класс Mammal производится от Animal в строках 29—37 и не содержит никаких данных. В нем замещается функция Reproduce, чтобы задать способ размножения, общий для всех млекопитающих. Класс Fish производится непосредственно от класса Animal, поэтому функция Reproduce в нем замещается иначе, чем в классе Mammal (и это соответствует реальности).

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