Объектно-ориентированное программирование


Объектно-ориентированное программирование - стр. 101


В каждом потомке данного объекта запись VMT для определенного виртуального метода будет всегда находиться в том же месте VMT. VMT -  объекта - потомка начинается так же, как и VMT- предка. Когда потомок перекрывает виртуальный метод, адрес нового метода помещается в соответствующую позицию VMT. Когда потомок добавляет новые виртуальные методы, они добавляются к концу VMT для этого объекта.

Если VMT подобна массиву адресов методов, то DMT  подобна разреженному массиву адресов. Вместо того чтобы иметь запись для каждого динамического метода, она содержит только адреса динамических методов, объявленных в текущем объектном типе. Это сокращает размер DMT  по сравнению с соответствующей VMT, но означает также, что вызов динамического метода выполняется дольше. Диспетчер динамических методов должен найти требуемый адрес, а не просто извлечь его по известному смещению VMT.

Для обычной процедуры компилятор генерирует код, который непосредственно вызывает адрес процедуры. Для статического  метода он помещает адрес экземпляра объекта в стек. Помещение этого адреса в стек инициализирует параметр Self; затем компилятор непосредственно вызывает адрес метода. Сгенерированный код для вызова виртуального метода снова начинается с помещения в стек адреса самого объекта. Первое слово экземпляра этого объектного типа является смещением VMT. Таким образом, таблица виртуальных методов начинается со смещения VMT, поэтому вызов FAR  по сохраненному адресу  вызывает первый виртуальный метод.

Вызов динамического метода аналогичен вызову виртуального метода до косвенного вызова  FAR далее они различаются. Вместо генерации этого вызова компилятор генерирует код, который помещает индекс динамического метода в соответствующий регистр и вызывает диспетчер динамических методов. Диспетчер ищет метод с соответствующим индексом в DMT объекта. Если он не находит такой метод, то прослеживает цепочку DMT предков до тех пор, пока не находит совпадающий индекс; тогда он вызывает метод по соответствующему адресу.




Начало  Назад  Вперед



Книжный магазин