Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Otvety_na_ekzamen_po_OOP.doc
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
293.89 Кб
Скачать

21. Виртуальные, динамические методы

^ Синтаксис один, семантически это одно и то же, результат тот же самый. Различие состоит во внутреннем механизме, используемом компонентами для реализации позднего связывания. Обращение к любому виртуальному методу происходит через таблицу VMT, которая представляет собой массив адресов методов. Каждый класс обладает своей собственной таблицей, где хранятся адреса виртуальных методов этого класса. Чтобы передать управление некоторому виртуальному методу, компилятор генерирует код, выполняет переход по адресу, указанному в ячейке, соответствующей указанному методу. Т.е. VMT обеспечивает быстрое выполнение вызовов. Недостатком является то, что требуется отдельной ячейки для каждого виртуального метода каждого дочернего класса, даже если этот метод не был перекрыт ни в одном из дочерних классов. Для больших иерархий требуются большие объемы памяти. Для осуществления вызова динамического метода, используется специальный уникальный номер, с помощью которого метод идентифицируется. Поиск адреса соответствующей функции или процедуры, как правило, осуществляется медленнее, чем по таблице. Применение динамического метода заключается в том, что информация о методах копируется в дочерний класс только в том случае, если метод был перекрыт в этом классе. Для глубоких иерархий использование такого метода может привести к существенной экономии памяти. Пусть определены три класса, один из которых является базовым для двух других: {Tуре TPerson = class fname: string; // имя constructor Create(name:string); function info: string; virtual; end; TStud = class(TPerson) fgr:integer; // номер учебной труппы constructor Create(name:string;gr:integer); function info: string; override; end; TPerson TProf = class(TPerson) fdep:string; // название кафедры constructor Create(name:string;dep:string); function info: string; override; end;}

///

Разница между виртуальными и динамическими методами заключается в особенности поиска адреса. Когда компилятор встречает обращение к виртуальному методу, он подставляет вместо прямого вызова по конкретному адресу код,который обращается к VMT и извлекает оттуда нужный адрес. Такая таблица есть для каждого класса (объектного типа). В ней хранятся адреса всех виртуальных методов класса, независимо от того, унаследованы ли они от предка или перекрыты в данном классе. Отсюда и достоинства и недостатки виртуальных методов: они вызываются сравнительно быстро, однако для хранения указателей наних в таблице VMT требуется большое количество памяти.

Динамические методы вызываются медленнее, но позволяют более экономно расходовать память. Каждому динамическому методу системой присваивается уникальный индекс. В таблице динамических методов класса хранятся индексы и адреса только тех динамических методов, которые описаны в данном классе. При вызове динамического метода происходит поиск в этой таблице; в случае неудачи просматриваются таблицы DMT всех классов-предков в порядке иерархии и, наконец, TObject, где имеется стандартный обработчик вызова динамических методов. Экономия памяти налицо. Т.о., различие виртуальных и динамических методов состоит только в способе хранения их адресов. Адрес виртуального метода дальнего предка можно быстро взять из таблицы VMT данного класса, а для поиска адреса динамического метода дальнего предка придется по очереди

перебирать всю иерархическую цепочку данного класса, что гораздо медленнее, но экономит память. Директива override указывает что перекрывается динамический или виртуальный метод класса-предка. Без этой директивы перекрытие перекрывается динамических или виртуальных методов невозможно.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]