Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
учебник_Часть_2.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
1.12 Mб
Скачать

2.7. Виртуальные методы. Конструкторы и деструкторы

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

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

Чтобы воспользоваться виртуальными методами, необходимо выполнить следующие действия:

1. В описании объекта после заголовка виртуального метода добавить слово virtual.

2. Заголовки виртуальных методов предка и потомка должны в точности совпадать, причем оба метода должны быть виртуальными.

3. Инициализация экземпляра объекта должна выполняться методом особого вида, который называется конструктором:

Constructor <имя блока> [(<перечень формальных параметров>)];

Это разновидность процедуры. Явно записанных действий в нем может и не быть, как и формальных параметров.

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

Помимо действий, заложенных в него программистом, конструктор выполняет подготовку механизма позднего связывания виртуальных методов, следовательно, до вызова любого виртуального метода должен быть выполнен конструктор.

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

Destructor <имя блока> [(<список формальных параметров>);

2.7.1. Правила работы с виртуальными методами

1. К конструктору необходимо обращаться для каждого объекта (не типа), использующего виртуальные методы, до их применения к этому объекту. Даже если объект B «обработан» конструктором, после снятия его копии А (А:=В) требуется обращение к конструктору уже для копии.

2. Сами конструкторы виртуальными быть не могут.

3. Объявление методов виртуальными должно быть обоснованным, так как связано с расходованием ресурсов.

4. Метод может быть объявлен виртуальным только вместе со всеми своими одноименными методами.

5. Одноименные виртуальные методы должны иметь идентичный список параметров, а если метод является функцией – быть идентичного типа.

6. Конструктор лучше совмещать с инициализацией (порождением) объекта.

7. Разрешено наследовать виртуальные методы.

Задание для самостоятельной работы

Создать семейство типов «летающих» фигур (рис. 2.3), изменяющих размеры, цвет и пропорции. Описать метод Fly, реализующий свободный (хаотический) «полет» фигуры по принципу: «Скрытие изображения» (Hide)  «смена позиции»  «воспроизведение на новом месте» (Show).

Для каждого типа фигуры методы Hide и Show будут специфическими, следовательно, они могут быть виртуальными.

абстрактный родительский тип

Рис. 2.3. Семейство» типов