Задание 6 - дата 15 мая

Часть 1. Скидочные книги [40 баллов] (реализация - если возникли проблемы )

  1. Создайте (или возьмите из предыдущего занятия) класс книги (Book), которая определяется своим названием, автором и стоимостью (это поля класса и аргументы конструктора).
  2. Поместите в класс книги две функции-члена:
    • защищённая (protected) невиртуальная функция real_price() — возвращает значение поля цены;
    • открытая виртуальная функция bulk_price(int amount), которая возвращает цену за amount книг и использует в своей реализации real_price.
  3. Создайте открытого (public) наследника класса книги: DiscountBook, скидочную книгу, которая задаётся кроме всех параметров книги Book ещё и размером скидки и количеством экземпляров, с которого данная скидка начинает действовать (discount_threshold). В конструкторе необходимо инициализировать базовый класс в списке инициализации (по другому вы не договоритесь с компилятором).
  4. Переопределите функцию real_price в классе скидочной книги: она должна возвращать значение цены (Book::real_price()), умноженной на величину скидки.
  5. Переопределите (не забыть ключевое слово override) функцию bulk_price в классе скидочной книги: в зависимости от количества книг используется базовый расчёт цены (Book::real_price()) или скидочный (то есть просто real_price()) — если книг больше, чем discount_threshold.
  6. Создайте свободную (внешнюю, т.е. вне классов ) функцию print_total_price, которая принимает ссылку на Book и количество экземпляров (amount), которое собирается приобрести покупатель. Функция печатает название и автора книги (потребуется добавить открытые геттеры для соответствующих полей), а также цену за amount экземпляров, используя bulk_price.

В основной программе вызовите функцию для одной обычной и одной скидочной книги.

Часть 2. Иерархия: Многоугольник — Прямоугольник [50 баллов]

Реализуйте приведённую ниже диаграмму классов и продемонстрируйте использование соответствующих классов, иллюстрируя основные идеи наследования:

  • вызов метода, определённого в предке (display),
  • вызов виртуальной функции (вызов display и perimeter в main),
  • полиморфное присваивание (в main).

Помните один из важных принципов составления UML-диаграмм: «свойства» классов (то, что перечисляется сразу под именем) могут быть как полями, так и настоящими свойствами, то есть, в случае C++, функциями-членами.

Звёздочка на UML-диаграмме всегда означает «нуль или больше», но никак не указатель C/C++.


Написать демонстрацию и возможные тесты (10 баллов)