
- •Объектно–ориентированное программирование
- •I. Основные принципы ооп
- •II. Структура объявления объектного типа
- •III. Свойство наследования
- •1. Правила наследования.
- •2. Свойство полиморфизма.
- •IV. Виртуальные методы
- •1. Раннее и позднее связывание методов.
- •2. Виртуальные методы и таблица виртуальных методов (твм).
- •3. Конструктор.
- •4. Деструктор.
- •V. Пример объектного типа
- •3. Объявление объектного типа точка:
- •4. Определение методов объекта point:
- •5. Свойство наследования.
- •7. Раннее и позднее связывание методов.
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.