Задание 6 - дата 15 мая
Требуемые условия завершения
Открыто с: понедельник, 15 мая 2017, 17:00
Срок сдачи: вторник, 23 мая 2017, 00:00
Часть 1. Скидочные книги [40 баллов] (реализация - если возникли проблемы )
- Создайте (или возьмите из предыдущего занятия) класс книги (Book), которая определяется своим названием, автором и стоимостью (это поля класса и аргументы конструктора).
- Поместите в класс книги две функции-члена:
- защищённая (protected) невиртуальная функция real_price() — возвращает значение поля цены;
- открытая виртуальная функция bulk_price(int amount), которая возвращает цену за amount книг и использует в своей реализации real_price.
- Создайте открытого (public) наследника класса книги: DiscountBook, скидочную книгу, которая задаётся кроме всех параметров книги Book ещё и размером скидки и количеством экземпляров, с которого данная скидка начинает действовать (discount_threshold). В конструкторе необходимо инициализировать базовый класс в списке инициализации (по другому вы не договоритесь с компилятором).
- Переопределите функцию real_price в классе скидочной книги: она должна возвращать значение цены (Book::real_price()), умноженной на величину скидки.
- Переопределите (не забыть ключевое слово override) функцию bulk_price в классе скидочной книги: в зависимости от количества книг используется базовый расчёт цены (Book::real_price()) или скидочный (то есть просто real_price()) — если книг больше, чем discount_threshold.
- Создайте свободную (внешнюю, т.е. вне классов ) функцию print_total_price, которая принимает ссылку на Book и количество экземпляров (amount), которое собирается приобрести покупатель. Функция печатает название и автора книги (потребуется добавить открытые геттеры для соответствующих полей), а также цену за amount экземпляров, используя bulk_price.
В основной программе вызовите функцию для одной обычной и одной скидочной книги.
Часть 2. Иерархия: Многоугольник — Прямоугольник [50 баллов]
Реализуйте приведённую ниже диаграмму классов и продемонстрируйте использование соответствующих классов, иллюстрируя основные идеи наследования:
- вызов метода, определённого в предке (display),
- вызов виртуальной функции (вызов display и perimeter в main),
- полиморфное присваивание (в main).
Помните один из важных принципов составления UML-диаграмм: «свойства» классов (то, что перечисляется сразу под именем) могут быть как полями, так и настоящими свойствами, то есть, в случае C++, функциями-членами.
Звёздочка на UML-диаграмме всегда означает «нуль или больше», но никак не указатель C/C++.