сать Virtual. Заголовки виртуальных методов предка и потомка
должны в точности совпадать, причем оба метода должны быть
виртуальными. Отсюда следует, что при проектировании методов
следует учесть, что некоторые из них потребуют дальнейшего раз-
вития, и объявить их виртуальными.
И наконец, инициализация экземпляра объекта должна вы-
полняться методом особого вида, который называется
конструк-
тор.
Обычно на конструктор возлагается присвоение полям ис-
ходных значений, открытие файлов, первоначальный вывод на
экран и т.д. Помимо действий, заложенных в него программис-
том, конструктор выполняет подготовку так называемого меха-
низма позднего связывания виртуальных методов. Отсюда следу-
ет, что до вызова любого виртуального метода должен быть вы-
полнен какой-либо конструктор. Структура конструктора такая же,
как и
у
любой процедуры, только вместо слова Procedure в заго-
ловке метода пишется слово Constructor.
В паре с конструктором всегда существует и
деструктор,
роль
которого противоположна роли конструктора, — он выполняет
действия, завершающие работу
с
объектом: закрывает файлы, очи-
щает динамическую память, осуществляет восстановление неко-
торых состояний, предшествующих работе с объектом и т.д. Вооб-
ще деструктор может не выполнять никаких действий, но обяза-
тельно должен присутствовать
в
списке методов объекта. Заголовок
метода-деструктора начинается со слова Destructor, в осталь-
ном же его структура такая же, как и у любого другого метода.
Скажем теперь несколько слов о механизме раннего и позднего
связывания. Раннее связывание предполагает, что связь между ме-
тодами устанавливается во время трансляции программы,
в
то вре-
мя как позднее связывание предусматривает динамическую связь,
т.е.
реализуемую по мере необходимости в процессе выполнения
программы. За счет такого механизма и удается правильно устано-
вить все нужные связи для виртуальных
методов.
Результат поздне-
го связывания в этом случае зависит от типа того объекта, чей
метод обратился к виртуальному методу. Конструктор для подго-
товки позднего связывания устанавливает связь между экземпля-
ром объекта и таблицей виртуальных методов (VMT) объекта. Для
каждого виртуального метода VMT содержит его адрес. Вызов вир-
туального метода делается не прямо, а через
VMT:
сначала по име-
ни метода определяется его адрес, а затем по этому адресу переда-
ется управление. Именно по этим причинам использованию вирту-
альных методов должен предшествовать вызов конструктора.
Чтобы разместить объект в динамической памяти, надо опи-
сать
указатель на
него.
Выделение памяти
для
динамического объек-
та выполняется процедурой
NEW.
Поскольку сразу после этого про-
изводится инициализация объекта,
то для
объектов процедура
NEW
выглядит так:
162