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

  1. {0.75 балла} [Класс: LinePrinter] Определите класс LinePrinter — «принтер длинных строк» — с единственным методом void Print(string line).

    • Метод печати void Print(string line) должен печатать строку line (не содержит переходов на новую строку, это можно не проверять) следующим образом: line разбивается на набор строк по N символов в каждой строке; каждая строка длины N выводится на консоль в отдельной строке; последняя строка набора может содержать меньше N символов, если длина line не кратна N.
      Замечание. Выводить строки посимвольно запрещается, используйте подходящие методы класса string!

    • Конструктор класса должен принимать N > 0 — максимальное число символов в печатаемой строке.

    Пример:

    Исходная строка: 'Meantime we shall express our darker purpose.'
    
    Печать принтером для N = 11:
    
    Meantime we
     shall expr
    ess our dar
    ker purpose
    .
    
    Печать принтером для N = 5:
    Meant
    ime w
    e sha
    ll ex
    press
     our 
    darke
    r pur
    pose.

    Демонстрация. Проверьте работу принтера в основной программе. Проверьте принтер с параметром N = 1.

  2. {1.75 балла} [Класс: NumberedLinePrinter] Определите класс NumberedLinePrinter, который действует аналогично LinePrinter, но выводит номера печатаемых строк.
    Указание. Используйте наследование.

    Пример:

    Исходная строка: 'Meantime we shall express our darker purpose.'
    
    Печать принтером для N = 8:
    
    1. Meantime
    2. we shal
    3. l expres
    4. s our da
    5. rker pur
    6. pose.

    Демонстрация. Проверьте работу принтера в основной программе.

  3. {2.75 балла} [Класс: HidingLinePrinter] Определите класс принтера строки HidingLinePrinter, который кроме N принимает ещё один параметр — массив (или любую другую коллекцию) символов hiddenChars. Этот принтер печатает строку аналогично NumberedLinePrinter, но все символы из массива hiddenChars заменяет звёздочками.

    Пример:

    Исходная строка: 'Meantime we shall express our darker purpose.'
    
    Печать принтером для N = 8, hiddenChars = ['e', 'o', 'a', 'p', 't']:
    
    1. M**n*im*
    2. w* sh*l
    3. l *x*r*s
    4. s *ur d*
    5. rk*r *ur
    6. **s*.

    Демонстрация. Проверьте работу принтера в основной программе.

  4. {3.25 балла}

    Cоздать коллекцию объектов-принтеров, которая содержит все три вида принтеров.

    	vector<LinePrinter *> printers;
    	printers.push_back(new LinePrinter(10));
    	printers.push_back(new NumberedLinePrinter(10));
    	printers.push_back(new HidingLinePrinter(10, a));
    

    С помощью каждого принтера из этой коллекции распечатайте одну и ту же строку.

    Указание Чтобы заставить нашу программу использовать Print того класса принтера, к которому каждый объект-принтер из коллекции относится на самом деле (на этапе выполнения программы), необходимо «активировать» для метода Print позднее связывание. Для этого в базовом классе Print нужно объявить виртуальным с помощью ключевого слова virtual, а при переопределении метода в классе-потомке следует указать ключевое слово override.

  5. {4 балла} Добавьте в класс LinePrinter два метода:

    1. процедуру FancyPrint, который принимает вектор (или любую другую коллекцию) строк (строки не содержат символов перехода на новую строку, это можно не проверять).
    2. protected-функцию PadFancy, которая принимает строку line и натуральное число N > 0, и возвращает строку, которая представляет собой line, возможно дополненную символами решётки (#) до длины N (если длина line < N).

    Метод FancyPrint должен печатать строки массива, преобразованные с помощью PadFancy, где в качестве N берётся длина самой длинной строки массива.

    Сделайте так, чтобы FancyPrint класса HidingLinePrinter дополнял строки вектора не решётками, а случайной последовательностью цифр. 

    Указание. Переопределять метод FancyPrint запрещается.

  6. Демонстрация. Вызовите FancyPrint для каждого принтера из коллекции

Дополнительные задачи

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