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

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

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

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

    class DiscountBook :
    	public Book // указывается тип наследования и базовый класс
            ...............................
    
    В конструкторе необходимо инициализировать базовый класс в списке инициализации (по другому вы не договоритесь с компилятором).
    DiscountBook(const string & title, const string & author, double price, int discount, int discount_threshold):
    	Book(title, author, price), ...
    
  4. [1 балл] Переопределите функцию real_price в классе скидочной книги: она должна возвращать значение цены (Book::real_price()), умноженной на величину скидки.

  5. Переопределите (не забыть ключевое слово override) функцию bulk_price в классе скидочной книги: в зависимости от количества книг используется базовый расчёт цены (Book::real_price()) или скидочный (то есть просто real_price()) — если книг больше, чем discount_threshold.

  6. Создайте свободную функцию print_total_price(Book * book, int amount), которая принимает указатель на Book и количество экземпляров (amount), которое собирается приобрести покупатель. Функция печатает название и автора книги (потребуется добавить открытые геттеры для соответствующих полей), а также цену за amount экземпляров, используя bulk_price.

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

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

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