Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Учебное пособие 400107.doc
Скачиваний:
5
Добавлен:
30.04.2022
Размер:
568.32 Кб
Скачать
      1. Конструкторы и деструкторы

Если в описании объекта имеются виртуальные методы, конструкторы или деструкторы, компилятор создаёт специальное поле, именуемое таблицей виртуального метода VMT (Virtual Method Table). Длина поля VMT 16 битов. Он расположен в области данных и инициализируется конструктором при его вызове.

Пример.

Type

LocationPtr=^Location; {тип указателя на объект}

Location = object

X,Y:integer;

Procedure Init(InitX,InitY:integer);

Function GetX:integer;

Function GetY:integer;

End;

PointPtr=^Point

Point = Object(Location)

Visible:Boolean;

Constructor Init(InitX,InitY:integer); {конструктор}

Procedure Show;Virtual; {виртуальный метод}

Procedure Hide;Virtual; {виртуальный метод}

Function IsVisible:Boolean;

Procedure MoveTo(NewX,NewY:integer);

End;

CirclePtr=^Circle;

Circle = Object(Point)

Radius:integer;

Constructor Init(InitX,InitY:integer;InitRadius:integer);

Procedure Show;Virtual;

Procedure Hide;Virtual;

Procedure Expand(ExpandBy:integer);Virtual;

Procedure Contract(ContractBy:integer);Virtual;

End;

Расположение данных в памяти показано на рис. 2.3. Объект Location не содержит виртуальных методов, конструктора и деструктора; поэтому среди данных нет VMT. Объект Point базируется на объекте Location. Поэтому сначала следует поле данных Location, затем его собственные поля, сначала данные (Visible), затем VMT. Объект Circle базируется на объекте Point, поэтому сначала следуют все поля Point, включая VMT, а затем его собственные данные (Radius).

Location Point Circle

Рис. 2.3. Расположение данных в памяти

Поле VMT содержит адрес таблицы виртуального метода. Выделение в памяти места и заполнение VMT осуществляется транслятором автоматически; программисту VMT недоступно. Первое Слово в VMT (рис.2.4) содержит длину объекта, связанного с данным VMT. Эту информацию использует конструктор и деструктор, чтобы узнать, солько байтов необходимо зарезервировать (или освободить) при динамическом создании и уничтожении объектов операторами New и Dispose. Второе слово в VMT содержит отрицательное значение длины объекта (длину в дополнительном коде). Эта информация используется во время выполнения программы для определения: инициализирован объект или нет. Если объект инициализирован, то первое слово в VMT не должно быть равным нулю. Если это условие не выполнено, генерируется ошибка 210 времени выполнения. Проверка выполняется, если задана диреутива компилятора {&R+}. Наличие этой директивы удлиняет программу, поэтому ею целесообразно пользоваться во время отладки. После завершения отладки необходимо транслировать программу директивой {&R-}. За этими двумя словами в VMT следуют 32-битовые поля, по одному на каждый виртуальный метод, в последовательности их объявления в описании объекта. Каждое такое поле содержит адрес точки входа в метод (см. рис. 2.4). Для каждого объекта имеется только одно VMT, независимо от того, сколько переменных типа “объект” объявлено. Допустим, объявлены переменные P, Q типа (объект) Point и переменные C, D типа Circle. Тогда всем четырем переменным соответствуют свли поля данных (включая поле адреса VMT). Однако существуют только два VMT (для Point и для Circle).

Конструктор P.Init записывает фактический адрес VMT в соответствующие поля памяти переменной P. Аналогично работают конструкторы при инициализации других переменных типа объект.

Деструкторы используются при динамическом создании и уничтожении объектов (рассмотрим это в следующем параграфе).

Point VMT Circle VMT

Рис. 2.4. Структура VMT