Лабораторная работа №13. Наследование и полиморфизм

Лифты

  1. Создать класс SimpleElevator с двумя закрытыми полями: int storeys; - количество этажей и int currentStorey; - этаж, на котором находится лифт.

    • Класс должен иметь конструктор, принимающий единственное целое число - количество этажей и устанавливающий значение int currentStorey; равным единице. Количество этажей не может быть отрицательным, делайте проверку и выбрасывайте исключение при некорректной входной информации.
    • Класс должен иметь два защищённых метода void Up(); и void Down();, которые поднимают (или опускают) лифт на один этаж. При этом меняется поле int currentStorey;, недопустимые операции игнорируются;
    • Добавьте два метода - геттера int getStoreys() const; и int getCurrentStorey() const;, возвращающие количество этажей и текущий этаж. соответственно.

  2. Создать класс AutomaticElevator - открытый наследник SimpleElevator с конструктором, который принимает одно целое число и обращается в списке инициализации к конструктору базового класса. Создать методы:
    • защищённые методы void UpN(int n);, void DownN(int n); - перемещают лифт на N этажей вверх или вниз. Методы принимают только положительные параметры, некорректные операции игнорируются;
    • открытый метод void MoveTo(int storey); - перемещает лифт на заданный этаж. Метод обращается к UpN и DownN;
    Продемонстрировать использование класса в основной программе.
  3. Создать класс InformativeAutomaticElevator - открытый наследник AutomaticElevator. Перегрузить в нём методы void Up(); и void Down(); таким образом, чтобы после каждого перемещения выводился номер текущего этажа (не забываем о ключевых словах virtual и override). Продемонстрировать использование в основной программе.
  4. Создать класс VeryInformativeAutomaticElevator - открытый наследник InformativeAutomaticElevator. Перегрузить в нём методы void UpN(int n); и void DownN(int n); таким образом, чтобы перед началом движения выводилось сообщение с информацией о направлении движения, например Лифт идёт вверх на 5 этажей;. Продемонстрировать использование в основной программе.
  5. Создать класс RestrictiveAutomaticElevator - открытый наследник AutomaticElevator. Добавить в него поле std::set<int> restrictedStoreys; и открытый метод void RestrictStorey(int storey);, который добавляет новый этаж в restrictedStoreys. Метод void MoveTo(int strorey); перегрузить таким образом, чтобы этажи, перечисленные в restrictedStoreys, игнорировались. Продемонстрировать использование в основной программе.
  6. Реализовать функцию

    void bulk_move(std::vector<AutomaticElevator *> const & vElevs, int minStoreys, int N)

    которая повторяет N раз одно и то же действие: перемещает каждый лифт в коллекции на случайный этаж (с номером не больше minStoreys) с помощью функции MoveTo. Параметр minStoreys указывает минимальное число этажей в зданиях, к которым относятся данные лифты. К каждому лифту до перемещения выводится информация о его типе во время выполнения (RTTI, typeidtype_info::name).

    Проверьте работу созданной функции на максимально разнообразной коллекции лифтов. Не используйте динамическую память: вектор должен содержать адреса стековых объектов.