Внутренний формат данных объекта имеет сходство с внутренним
форматом записи. Поля объекта записываются в порядке их описаний
как непрерывная последовательность переменных. Любое поле, унас-
ледованное от родительского (порождающего) типа, записывается пе-
ред новыми полями, определенными в дочернем (порожденном) типе.
Если объектный тип определяет виртуальные методы, конструк-
тор или деструктор, то компилятор размещает в объектном типе до-
полнительное поле данных. Это 16-битовое поле, называемое полем
таблицы виртуальных методов (VMP), используется для запоминания
смещения таблицы виртуальных методов в сегменте данных. Поле таб-
лицы виртуальных методов следует непосредственно после обычных
полей объектного типа. Если объектный тип наследует виртуальные
методы, конструкторы или деструкторы (сборщики мусора), то он
также наследует и поле таблицы виртуальных методов, благодаря че-
му дополнительное поле таблицы виртуальных методов не выделяется.
Инициализация поля таблицы виртуальных методов экземпляра
объекта осуществляется конструктором (или конструкторами) объект-
ного типа. Программа никогда не инициализирует поле таблицы вир-
туальных методов явно и не имеет к нему доступа.
Следующие примеры иллюстрируют внутренние форматы данных
объектных типов.
type
PLocation = ^TLocation;
TLocation = object
X,Y: integer;
procedure Init(PX, PY: Integer);
function GetX: Integer;
function GetY: Integer;
end;
PPoint = ^TPoint;
TPoint = object(TLocation)
Color: Integer;
constructor Init(PX, PY, PColor: Integer);
destructor Done; virtual;
procedure Show; virtual;
procedure Hide; virtual;
procedure MoveTo(PX, PY: I+nteger); virtual;
end;
PCircle = ^TCircle;
TCircle = object(TPoint)
Radius: Integer;
constructor Init(PX, PY, PColor, PRadius: Integer);
procedure Show; virtual;
B.Pascal 7 & Objects/LR - 378 -
procedure Hide; virtual;
procedure Fill; virtual;
end;
Рисунок 21.8 показывает размещение экземпляров типов
TLocation, TPoint и TCircle: каждый прямоугольник соответствует
одному слову памяти.
TLocation TPoint TCircle
┌──────────┐ ┌───────────┐ ┌───────────┐
│ X │ │ X │ │ X │
├──────────┤ ├───────────┤ ├───────────┤
│ Y │ │ Y │ │ Y │
└──────────┘ ├───────────┤ ├───────────┤
│ Color │ │ Color │
├───────────┤ ├───────────┤
│ VMT │ │ VMT │
└───────────┘ ├───────────┤
│ Radius │
└───────────┘
Рис. 21.8 Схема экземпляров типов TLocation, TPoint и
TCircle.
Так как TPoint является первым типом в иерархии, который
вводит виртуальные методы, то поле таблицы виртуальных методов
размещается сразу после поля Color.