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;
B.Pascal 7 & Objects/LR - 383 -
На Рис. 21.10 и 21.11 показаны схемы таблицы виртуальных ме-
тодов и таблицы динамических методов для TBase и TDerived. Каждая
ячейка соответствует слову памяти, а каждая большая ячейка - двум
словам памяти.
ТВМ TBase ТДМ TBase
┌──────────────────┐ ┌──────────────────┐
│ 4 │ │ 0 │
├──────────────────┤ ├──────────────────┤
│ -4 │ │ индекс в кэш │
├──────────────────┤ ├──────────────────┤
│ Смещ. ТДМ TBase │ │ смещение записи │
├──────────────────┤ ├──────────────────┤
│ 0 │ │ 4 │
├──────────────────┤ ├──────────────────┤
│ │ │ 10 │
│ @TBase.Done │ ├──────────────────┤
│ │ │ 20 │
└──────────────────┘ ├──────────────────┤
│ 30 │
├──────────────────┤
│ 40 │
├──────────────────┤
│ │
│ @TBase.P10 │
│ │
├──────────────────┤
│ │
│ @TBase.P20 │
│ │
├──────────────────┤
│ │
│ @TBase.P30 │
│ │
├──────────────────┤
│ │
│ @TBase.P40 │
│ │
└──────────────────┘
Рис. 21.10 Схемы таблицы виртуальных методов и таблицы дина-
мических методов для TBase.
B.Pascal 7 & Objects/LR - 384 -
Объектный тип имеет таблицу динамических методов только в
том случае, если в нем вводятся или переопределяются динамические
методы. Если объектный тип наследует динамические методы, но они
не переопределяются, и новые динамические методы не вводятся, то
он просто наследует таблицу динамических методов своего предка.
Как и в случае таблицы виртуальных методов, таблица динами-
ческих методов записывается в инициализированную часть сегмента
данных прикладной программы.
ТВМ TDerived ТДМ TDerived
┌───────────────────┐ ┌──────────────────┐
│ 6 │ │ Смещ. ТДМ TBase │
├───────────────────┤ ├──────────────────┤
│ -6 │ │ индекс в кеше │
├───────────────────┤ ├──────────────────┤
│ Смещ. ТДМ TDerived│ │ смещение записи │
├───────────────────┤ ├──────────────────┤
│ 0 │ │ 3 │
├───────────────────┤ ├──────────────────┤
│ │ │ 10 │
│ @TBase.Done │ ├──────────────────┤
│ │ │ 30 │
└───────────────────┘ ├──────────────────┤
│ 50 │
├──────────────────┤
│ │
│ @TDerived.P10 │
│ │
├──────────────────┤
│ │
│ @TDerived.P30 │
│ │
├──────────────────┤
│ │
│ @TDerived.T50 │
│ │
└──────────────────┘
Рис. 21.11. Схемы таблицы виртуальных методов и таблицы ди-
намических методов для TDerived.
Первое слово таблицы динамических методов содержит смещение
сегмента данных родительской таблицы динамических методов, или 0,
если родительская таблица динамических методов отсутствует.
Второе и третье слово таблицы динамических методов использу-
ется в кеш-буфере просмотра динамических методов (см. далее).
Четвертое слово таблицы динамических методов содержит счет-
чик записи таблицы динамических методов. Непосредственно за ним
следует список слов, каждое из которых содержит индекс динамичес-
B.Pascal 7 & Objects/LR - 385 -
кого метода, а затем список соответствующих указателей методов.
Длина каждого списка задается счетчиком записи таблицы динамичес-
ких методов.
Значения файлового типа
─────────────────────────────────────────────────────────────────
Значения файлового типа представляются в виде записей. Типи-
зированные и нетипизированные файлы занимают 128 байт, которые
располагаются по следующей схеме:
type
TFileRec = record
Handle : word; { описатель }
Mode : word; { режим }
RecSize : word; { размер записи }
Private : array[1..26] of byte;
UserData : array[1..16] of byte;
Name : array[0..79] of char;
end;
Текстовые файлы занимают 256 байт со следующей схемой распо-
ложения:
type
TTextBuf = array[0..127] of char;
TTextRec = record
Handle : word;
Mode : word;
BufSize : word;
Private : word;
BufPos : word;
BufEnd : word;
BufPtr : ^TTextBuf;
OpenFunc : pointer;
