Лабораторная работа №10. Наследование

Часть 1. Скидочные книги [2 балла]

  1. Создайте класс книги (Book), которая определяется своим названием, автором и стоимостью (это поля класса и аргументы конструктора).

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

  4. [1 балл] Переопределите функцию 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. Иерархия: Многоугольник — Прямоугольник [1 балл]

  1. Определить класс Point с открытыми полями x, y типа double, конструктором Point(double x, double y) и методом static double distance(Point point1, Point point2), вычисляющим расстояние.
  2. Определить класс Polygon с полями int count (количество вершин) и vector<Point> vertices (вектор вершин). Определить конструктор Polygon(vector<Point> v). Перегрузить операцию вывода в поток. Определить метод void translate(double x, double y), которая перемещает все вершины на x по горизонтали и на y по вертикали. Определить метод double perimeter(), который возвращает периметр многоугольника.
  3. Определить класс Rectangle, наследующий Polygon с конструктором Rectangle(Point LeftUp, Point RightBottom).
  4. Продемонстрировать использование классов