Основы программирования на C++, PASCAL
За счет такого механизма и удается правильно установить все нужные связи для виртуальных методов. Результат позднего связывания в этом случае зависит от типа того объекта, чей метод обратился к виртуальному методу. Конструктор для подготовки позднего связывания устанавливает связь между экземпляром объекта и таблицей виртуальных методов (VMT) объекта. Для каждого виртуального метода VMT содержит его адрес. Вызов виртуального метода делается не прямо, а через VMT: сначала по имени метода определяется его адрес, а затем по этому адресу передается управление. Именно по этим причинам использованию виртуальных методов должен предшествовать вызов конструктора.
Чтобы разместить объект в динамической памяти, надо описать указатель на него. Выделение памяти для динамического объекта выполняется процедурой NEW. Поскольку сразу после этого производится инициализация объекта, то для объектов процедура NEW выглядит так:
NEW(<yказатель на объект>, <конструктор>)
Высвобождение динамической памяти, занятой объектом, выполняется процедурой DISPOSE. Перед этим выполняются действия, завершающие работу с объектом, поэтому для объектов процедура DISPOSE выглядит так:
DISPOSE (<указатель на объект>, <деструктор>)
Нельзя освободить память, занятую динамическим объектом, если у него нет деструктора, хотя бы и пустого.
Пример 6. Сложное меню в динамической памяти. Построим сложное иерархическое меню: пробел будет открывать главное меню, нажатие на клавишу Enter будет разворачивать подсвеченный пункт в меню или, если пункт находится в подменю, клавиша Enter будет сворачивать подменю. Работа будет завершаться по нажатию на клавишу Esc. Нижний уровень меню располагаем вертикально, главное меню — горизонтально. (В роли пунктов главного меню будут выступать некоторые классы языков программирования, а в качестве подпунктов — примеры таких языков.)
При исполнении этой программы появляется пустой экран. После нажатия на клавишу пробел на экране появится строка из трех пунктов главного меню:
Желтым цветом выделен первый пункт меню. Если нажать на клавишу Enter, то появится вертикальное подменю:
с выделенным цветом первым пунктом. Смена выбранного пункта (продвижение по пунктам) производится при помощи клавиши пробел. Нажатием на клавишу Enter закрывается подменю. Выход из программы выполняется при помощи клавиши Esc.