Таблица виртуальных методов объектного типа содержит для каждого описанного в объектном типе виртуального метода и его предков четырехбайтовую запись. В тех случаях, когда в порождаю- щих типах (предках) определяется большее число виртуальных мето- дов, в процессе создания производных типов может использоваться достаточно большой объем памяти, особенно если создается много производных типов. Хотя в производных типах могут переопределять- ся только некоторые из наследуемых методов, таблица виртуальных методов каждого производного типа содержит указатели метода для всех наследуемых виртуальных методов, даже если они не изменя- лись.
Динамические методы обеспечивают в таких ситуациях альтерна- тиву. В Borland Pascal имеется формат таблицы методов и новый способ диспетчеризации методов с поздним связыванием. Вместо ко- дирования для всех методов объектного типа с поздним связыванием, в таблице динамических методов кодируются только те методы, кото- рые были в объектном типе переопределены. Если в наследующих ти- пах переопределяются только некоторые из большого числа методов с поздним связыванием, формат таблицы динамических методов исполь- зует меньшее пространство, чем формат таблицы виртуальных мето- дов.
Формат таблицы динамических методов иллюстрируют следующие два объектных типа:
type TBase = object X: Integer; constructor Init; destructor Done; virtual; procedure P10; virtual 10; procedure P20; virtual 20; procedure P30; virtual 30; procedure P30; virtual 30; end;
type TDerived = object(TBase) Y: Integer; constructor Init; destructor Done; virtual; procedure P10; virtual 10; procedure P30; virtual 30; procedure P50; virtual 50; end;
На Рис. 21.10 и 21.11 показаны схемы таблицы виртуальных ме- тодов и таблицы динамических методов для TBase и TDerived. Каждая ячейка соответствует слову памяти, а каждая большая ячейка - двум словам памяти.
ТВМ TBase ТДМ TBase ------------------- ------------------- ¦ 4 ¦ ¦ 0 ¦ +------------------+ +------------------+ ¦ -4 ¦ ¦ индекс в кэш ¦ +------------------+ +------------------+ ¦ Смещ. ТДМ TBase ¦ ¦ смещение записи ¦ +------------------+ +------------------+ ¦ 0 ¦ ¦ 4 ¦ +------------------+ +------------------+ ¦ ¦ ¦ 10 ¦ ¦ @TBase.Done ¦ +------------------+ ¦ ¦ ¦ 20 ¦ L------------------- +------------------+ ¦ 30 ¦ +------------------+ ¦ 40 ¦ +------------------+ ¦ ¦ ¦ @TBase.P10 ¦ ¦ ¦ +------------------+ ¦ ¦ ¦ @TBase.P20 ¦ ¦ ¦ +------------------+ ¦ ¦ ¦ @TBase.P30 ¦ ¦ ¦ +------------------+ ¦ ¦ ¦ @TBase.P40 ¦ ¦ ¦ L-------------------