Распознанный текст, спецсимволы и формулы могут содержать ошибки, поэтому с корректным вариантом рекомендуем ознакомиться на отсканированных изображениях учебника выше Также, советуем воспользоваться поиском по сайту, мы уверены, что вы сможете найти больше информации по нужной Вам тематике 6.4. Виртуальные функции
Описанные классы CLine, CRect и CEllipse могут быть использованы для хранения и отображения на экране соответствующих графических примитивов. Предположим, что в программе создается три графических объекта: линия, прямоугольник и эллипс, с некоторыми заданными координатами и свойствами. В этом случае алгоритм хранения и отображения объектов может быть представлен следующим образом.
В данном примере был введен новый класс CObj, который является базовым по отношению к CPos. Но, учитывая, что класс CPos является базовым для классов CLine, CRect и CEllipse, то класс CObj оказывается общим для всех них. Таким образом, получаем иерархию объектов, показанную на рис. 6.2.
Рис. 6.2. Иерархия объектов программы листинга 6.1 Благодаря введению класса CObj в иерархию объектов, классы CLine, CRect и CEllipse можно рассматривать с единых позиций: как объект CObj. Это значит, что любой указатель на эти три класса можно присвоить указателю типа CObj без операции приведения типа, и наоборот, имея указатель типа CObj на один из трех объектов, можно его преобразовать в указатель на конкретный объект CLine, CRect или CEllipse. Однако чтобы выполнить такое преобразование, необходима операция приведения типов, которая в представленной программе выглядит следующим образом:
Именно поэтому в цикле for необходимо использовать оператор switch для определения типа объекта. При этом тип объекта хранится в переменной type_obj класса CObj и означиватся в момент создания экземпляров графических объектов в соответствующих конструкторах. Такой прием программирования позволяет всегда иметь достоверную информацию о типе используемого объекта на разных уровнях иерархии классов. Кроме того, введение класса CObj позволяет создавать удобное однотипное хранилище для разнотипных объектов CLine, CRect и CEllipse, которое в программе представлено в виде массива
В заключение программы выполняется операция удаления созданных объектов. При этом следует удалять объекты графических примитивов, а не объекты типа CObj. Поэтому здесь также организуется цикл for, в котором определяется тип объекта, а затем используется оператор delete для его удаления. Основным недостатком представленной программы является необходимость определения типа объекта перед началом работы с ним, что приводит к громоздкому тексту программы подобно структурному подходу к программированию. Исправить этот недостаток можно путем использования виртуальных функций. Идея виртуальных функций заключается в том, что они могут быть описаны в базовом классе, а их конкретные реализации в производных. Применительно к задаче работы с графическими рбъектами функцию Draw() целесообразно сделать виртуальной, которая будет задана в базовом классе по отношению к классам CLine, CRect и CEllipse, а реализации находиться в дочерних. В связи с этим, имеет смысл ввести еще один новый класс CObjView, отвечающий за рисование графических примитивов и очевидно, он должен находиться в иерархии объектов, как показано на рис. 6.3.
Рис. 6.3. Иерархия объектов с новыми классом CObjView Для того чтобы задать виртуальную функцию используется ключевое слово virtual, за которым следует прототип функции. Таким образом, получаем следующее описание класса CObjView с виртуальной функцией Draw():
Затем следует описание класса CLine:
и аналогично описываются классы CRect и CEllipse. Благодаря использованию виртуальной функции, фрагмент программы для отображения графических примитивов можно записать следующим образом:
Цикл for здесь содержит всего две строки программы. Причем они останутся неизменными при любом числе графических объектов, что представляет большое удобство для программиста. Последний пример показывает как ООП позволяет заметно упростить текст программы по сравнению со структурным подходом к программированию. Видео по теме
|
1 |
Оглавление
|