Освой самостоятельно С++ за 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
Анализ:
Класс Mammal производится от Animal в строках 29—37 и не содержит никаких данных. В нем замещается функция Reproduce, чтобы задать способ размножения, общий для всех млекопитающих. Класс Fish производится непосредственно от класса Animal, поэтому функция Reproduce в нем замещается иначе, чем в классе Mammal (и это соответствует реальности).