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

на главную

Жанры

Освой самостоятельно С++ за 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"; }

Поделиться:
Популярные книги

СД. Том 17

Клеванский Кирилл Сергеевич
17. Сердце дракона
Фантастика:
боевая фантастика
6.70
рейтинг книги
СД. Том 17

Идеальный мир для Лекаря 12

Сапфир Олег
12. Лекарь
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 12

Шипучка для Сухого

Зайцева Мария
Любовные романы:
современные любовные романы
8.29
рейтинг книги
Шипучка для Сухого

Мимик нового Мира 3

Северный Лис
2. Мимик!
Фантастика:
юмористическая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Мимик нового Мира 3

Мимик нового Мира 6

Северный Лис
5. Мимик!
Фантастика:
юмористическая фантастика
попаданцы
рпг
5.00
рейтинг книги
Мимик нового Мира 6

Деспот

Шагаева Наталья
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Деспот

Помещица Бедная Лиза

Шах Ольга
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Помещица Бедная Лиза

Небо для Беса

Рам Янка
3. Самбисты
Любовные романы:
современные любовные романы
5.25
рейтинг книги
Небо для Беса

Полководец поневоле

Распопов Дмитрий Викторович
3. Фараон
Фантастика:
попаданцы
5.00
рейтинг книги
Полководец поневоле

"Дальние горизонты. Дух". Компиляция. Книги 1-25

Усманов Хайдарали
Собрание сочинений
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Дальние горизонты. Дух. Компиляция. Книги 1-25

Колючка для высшего эльфа или сиротка в академии

Жарова Анита
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Колючка для высшего эльфа или сиротка в академии

Последний попаданец 8

Зубов Константин
8. Последний попаданец
Фантастика:
юмористическая фантастика
рпг
5.00
рейтинг книги
Последний попаданец 8

Протокол "Наследник"

Лисина Александра
1. Гибрид
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Протокол Наследник

Огненный князь

Машуков Тимур
1. Багряный восход
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Огненный князь