Освой самостоятельно С++ за 21 день.
Шрифт:
Далее в программе все три функции базового класса замешаются в производных классах Circle и Rectangle, но одна из них — функция Draw — выполняется как чистая виртуальная функция, поскольку в объявлении замещенного варианта функции в производных классах есть вызов исходной функции из базового класса. В результате выполнение этой функции в обоих производных классах приводит к выведению на экран одного и того же сообщения.
Сложная
Иногда бывает необходимо произвести один класс ADT от другого класса ADT, например для того, чтобы в производном классе ADT преобразовать в обычные методы часть функций, объявленных в базовом классе как чистые виртуальные, оставив при этом другие функции чистыми.
Так, в классе Animal можно объявить методы Eat, Sleep, Move и Reproduce как чистые виртуальные функции. Затем от класса Animal производятся классы Mammal и Fish.
Исходя из соображения, что все млекопитающие размножаются практически одинаково, имеет смысл в классе Mammal преобразовать метод Reproduce в обычный, оставив при этом методы Eat, Sleep и Move чистыми виртуальными функциями.
Затем от класса Mammal производится класс Dog, в котором необходимо заместить все три оставшиеся чистые виртуальные функции, чтобы получить возможность создавать объекты класса Dog.
Таким образом, наследование одного класса ADT от другого класса ADT позволяет объявлять общие методы для всех следующих производных классов, чтобы не замещать потом эти функции по отдельности в каждом производном классе.
В листинге 13.10 показан базовый костяк программы, в котором используется объявленный выше подход.
Листинг 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"; }