Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
30
Добавлен:
16.04.2013
Размер:
220.66 Кб
Скачать

Конструкторы

Если объектный тип содержит виртуальные методы, то он обязательно должен содержать хотя бы один особый метод, называемый конструктором. Синтаксически конструктор оформляется как обычный метод с заменой служебного слова Procedure на служебное слово Constructor. Метод-конструктор должен быть применён к каждому отдельному экземпляру объекта до первого вызова им виртуального метода. Сам же конструктор не должен быть виртуальным.

+----------------------------------------------------------------+

¦ TCircle ¦

¦ +----------------------------+ ¦

¦ ¦ TPoints ¦ ¦

¦ ¦ ... ¦ ... ¦

¦ ¦ +---------------+ ¦ +---------------+ ¦

¦ ¦ P+---->¦ Show ¦ ¦ ¦ Show +<--+C ¦

¦ ¦ ¦ +---------------¦ ¦ +---------------¦ ¦ ¦

¦ ¦ P+---->¦ Hide ¦ ¦ ¦ Hide +<--¦C ¦

¦ ¦ ¦ +---------------¦ ¦ C +---------------+ ¦ ¦

¦ ¦ +-----¦ Move +--+--------------------------+ ¦

¦ ¦ +---------------+ ¦ ¦

¦ ¦ ^ ^ ¦ ¦

¦ ¦ P¦ C+------+--------------+ ¦

¦ +------------+---------------+ C¦ ¦

+----------------+------------------------------+----------------+

¦ ¦

P.Move(50,50) C.Move(50,50)

Рис.16

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

Constructor TPoints.Emp;

Begin

End;

Что же делает конструктор? На этапе компиляции для каждого объектного типа устанавливаются жёсткие ссылки только на статические методы, а для виртуальных методов создаётся так называемая таблица виртуальных методов данного объектного типа (VMT). Эта таблица содержит размер объектного типа и указатель на каждый виртуальный метод.

На этапе исполнения конструктор, вызванный некоторым экземпляром, сначала выполняет действия, предписанные ему, как методу, затем заносит в специальное поле этого экземпляра адрес соответствующей таблицы VMT. Так устанавливается связь между конкретным экземпляром и таблицей VMT. В дальнейшем при вызове этим экземпляром виртуального метода местонахождение кода этого метода определяется по таблице VMT, адрес которой экземпляру уже известен.

Если же для некоторого экземпляра конструктор не будет вызван до обращения к виртуальному методу, то этот экземпляр не сможет найти нужный метод, т.к. ему неизвестен адрес таблицы VMT. Подумайте, почему сам конструктор не может быть виртуальным ?

В нашем примере (см. рис.15) в качестве конструкторов в объектных типах TPoints и TCircle выступают одноимённые методы Init, устанавливающие начальные значения полей объектных типов. В этом случае в программе, представленной на рис.13, действия над каждым экземпляром P и С будут начинаться с вызова конструктора Init. Только после этого вызываются виртуальные методы Show и Hide и в явном виде и посредством вызова статического метода Move, в который вложены вызовы виртуальных методов Show и Hide.

Соседние файлы в папке ВМИП