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