Ответы на экзаменационные вопросы № 1-34 по дисциплине "Программирование" (Средства модульного программирования в системе Турбо-Паскаль. ООП. Объекты в динамической памяти), страница 28

End.

Таким образом, ООП дает возможность новому типу не только наследовать поля и методы типа-предка, добавляя новые при необходимости, но и позволяет новые методы связать с уже существующими. Свойство, позволяющее изменять функционирование программы с помощью добавления новых характеристик без изменения остального кода программы, называется способностью к расширению и является важным преимуществом ООП.

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

Однако, с другой стороны, если у объекта имеются виртуальные методы, то в сегменте данных будет создана таблица виртуальных методов, которая уже упоминалась, и каждый экземпляр объекта должен быть связан с ней. То есть каждый вызов виртуального метода должен проходить через таблицу виртуальных методов, что несколько замедляет быстродействие программы, в то время как статические методы вызываются непосредственно, что экономит время, но лишает программу способности к расширению.

Таблица виртуальн. методов.

Внутреннее представление объектов сходно с представлением записей. Поля объекта размещаются в памяти в порядке их описания, каждое поле, унаследованное от родительского типа, располагается перед новыми полями. Если объект содержит только статические методы (раннее связывание), то вслед за полями размещаются указатели на соответствующие методы (рис.1).

Такой подход, хотя и приемлем по скорости выполнения, является затратным с точки зрения другого важного ресурса - памяти. Каждый объект должен отводить память (1 указатель) для каждого метода. Возможен компромисс между скоростью и памятью, который основан на том, что все экземпляры одного объекта должны совместно использовать одни и те же методы. Этот подход реализуется в случае, если объект содержит или наследует виртуальные методы (и, следовательно, конструкторы и, возможно, деструкторы). При таком подходе для всех экземпляров одного объекта в сегменте данных создается единственная таблица, называемая таблицей виртуальных методов(ТВМ), и все экземпляры объекта содержат поле, где размещается адрес ТВМ. Значение полей в ТВМ - это указатели на процедуры. При условии, что эти процедуры известны компилятору и не меняются во время исполнения программы, ТВМ может быть создана статически, во время компиляции. Таким образом, чтобы выполнить метод, надо только знать его адрес (смещение) в таблице виртуальных методов.

Схематически ТВМ представлена на рис.2. Первое слово таблицы содержит размер экземпляра объекта - эта информация передается конструкторам и деструкторам для определения размера памяти, которое необходимо для выделения или освобождения с помощью расширенного вызова процедур New и Dispose. Следующее слово содержит отрицательное значение размера экземпляра объекта. Все это необходимо для того, чтобы определить, был ли инициализирован экземпляр объекта с помощью конструктора, и для проверки правильности ТВМ. При вызове виртуального метода устанавливается соответствие между параметром self, объектом и таблицей виртуальных методов. Если включена директива {$г+}, то каждый раз перед вызовом виртуального метода вызывается подпрограмма контроля обращения к ТВМ. При этом проверяется неравенство нулю первого слова ТВМ и равенство нулю суммы первого и второго слов. В зависимости от результатов проверки может генерироваться ошибка выполнения или управление передается на код необходимого виртуального метода.

Третье слово ТВМ содержит ноль, если в таблице нет динамических методов. Четвертое слово всегда равно нулю, Далее следует список 32-разрядных указателей методов. Если метод наследуется, то ТВМ дочернего объекта и объекта-предка содержат одинаковые указатели.