Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП_Лекции 2010.doc
Скачиваний:
69
Добавлен:
17.03.2015
Размер:
954.37 Кб
Скачать
      1. Иерархия классов Окно и Окно_с_текстом

Метод Инициализировать также должен быть переопределен, так как он должен инициализировать дополнительные, определенные в классе-потомке поля класса.

Класс Окно_с_текстом -родитель: класс Окно:

поля Хt, Yt, Text

метод Инициализировать (aX1,aY1,aX2,aY2,aColor,aXt, aYt, aText)

метод Изобразить

Конец описания.

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

Сложный полиморфизм или создание полиморфных объектов. Для расширения возможностей языка в Borland Pascal и C++ указателю на объект класса-родителя разрешено присваивать адрес объекта класса-потомка. Адресуемые через указатели объекты, которым в процессе выполнения программы может быть присвоено значение, тип которого отличается от типа переменной, были названы полиморфными. В рассматриваемых языках программирования подобная ситуация возникает:

• при передаче объекта класса-потомка в качестве фактического параметра подпрограмме, в которой этот параметр описан как параметр-переменная типа класса-родителя (явно - в списке параметров или неявно - в качестве внутреннего параметра self или this, используемых при вызове методов);

• при работе с динамическими объектами, когда указателю на объект класса-родителя присваивается адрес объекта класса-потомка.

Примечание. В принципе, в обоих случаях речь идет об одной и той же ситуации: во внутреннем представлении для передачи параметров-переменных используются указатели и адреса объектов (подробно см. в § 2.3, 3.4).

Тип полиморфного объекта становится известным только на этапе выполнения программы. Соответственно, при вызове полиморфного метода для такого объекта нужный аспект также должен определяться на этапе выполнения. Для этого в языке должен быть реализован механизм позднего связывания, позволяющий определять тип объекта и, соответственно, аспект полиморфного метода, к которому идет обращение в программе на этапе ее выполнения.

      1. Иерархия классов при сложном полиморфизме

Методы, для которых должно реализовываться позднее связывание, получили название динамических полиморфных или виртуальных. Для их описания в рассматриваемых далее языках программирования используется служебное слово virtual.

С помощью механизма позднего связывания реализуется оперативная перестройка программы в соответствии с типами используемых объектов.

Поясним сказанное на примере.

Пример 1.12. Сложный полиморфизм. Пусть родительский класс содержит два метода Out и Print, причем метод Out вызывает метод Print. Класс-потомок наследует метод Out, но имеет собственный метод Print (Рис. 2.4.).

При вызове метода Out для объекта класса-потомка необходимо обеспечить, чтобы этот метод вызывал метод Print потомка, а не родителя (Рис. 2.5.).

При раннем связывании определение адреса метода Print происходило бы на этапе компиляции программы, следовательно и для объекта родительского класса, и для объекта класса-потомка из метода Out вызывался бы метод Print класса-родителя. Определить, для объекта какого класса: родителя или потомка вызывается метод Out, можно только на этапе выполнения. Следовательно, для метода Print необходимо обеспечить позднее связывание.

Описание метода Print как метода, для которого запрещается определение адреса на этапе компиляции, приведет к тому, что адрес метода Print будет определяться в процессе выполнения программы. В этот момент уже будет известно, объект какого класса вызывает метод Out, и будет вызываться метод Print именно этого класса.