Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
OOP.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
55.3 Кб
Скачать

7. Раннее и позднее связывание методов.

Ранее рассмотренные статические методы компилятор размещает и разрешает все ссылки на них во время компиляции и компоновки (раннее связывание).

Для примера, описанного ранее, в объекте CIRCL можно наследовать метод MOVE у объекта POINT. Методы TURN_ON и TURN_OFF должны быть объявлены виртуальными, чтобы с ними произошло позднее связывание.

Компилятор оставляет после компиляции неразрешенными ссылки к тем методам, которые объявлены виртуальными. Для описанного ранее примера в методе MOVE неразрешенными ссылками будут адреса методов TURN_ON, TURN_OFF, т. е. процедура MOVE будет не готова к исполнению после компиляции, т. к. ее машинный код полностью не определен.

Во время выполнения программы до исполнения виртуальных методов любого объекта должен выполниться метод-конструктор для данного экземпляра объекта, в который компилятор вставляет действия по связи неразрешенных ссылок с ТВМ.

Объявления объектных типов PLACE, POINT и CIRCL с использованием конструктора и виртуальных методов:

type

PLACE=object

X,Y: integer;

constructor INIT(X0, Y0: integer);

function GET_X: integer;

function GET_Y: integer;

end;

POINT=object(PLACE)

V: boolean;

constructor INIT(X0, Y0: integer);

function GET_V: boolean;

procedure TURN_ON; virtual;

procedure TURN_OFF;virtual;

procedure MOVE(XN, YN: integer);

end;

CIRCL=object(POINT)

R: integer;

constructor INIT(X0, Y0, R0: integer);

function GET_R: integer;

procedure TURN_ON; virtual;

procedure TURN_OFF; virtual;

end;

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

Обращение к деструктору, как правило, указывается при освобождении памяти от динамического объекта при вызове процедуры DISPOSE:

DISPOSE (<имя_объекта>, <вызов_деструктора>);

Метод деструктора также может быть пустым:

DESTRUCTOR <ИМЯ>;

BEGIN

END;

При этом компилятором генерируется код в ответ на зарезервированное слово DESTRUCTOR.

6

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]