Borland Pascal. Руководство пользователя



         

Виртуальные методы - часть 2


Отметьте также новое зарезервированное слово constructor (конструктор), заменившее зарезервированное слово рrocedure для TWinged.Init и TBee.Init. Конструктор является специальным типом процедуры, которая выполняет некоторую установочную работу для механизма виртуальных методов. Более того, конструктор должен вы- зываться перед вызовом любого виртуального метода. Вызов вирту- ального метода без предварительного вызова конструктора может привести к блокированию системы, а у компилятора нет способа про- верить порядок вызова методов.

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

Предупреждение: Конструктор должен вызываться перед вызовом любого другого виртуального метода. Вызов виртуального метода без предыдущего обращения к конструктору может вызвать блокировку системы, и компилятор не сможет проверить порядок, в котором вы- зываются методы.

Примечание: Для конструкторов объекта мы предлагает использовать идентификатор Init.

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

var FBee, GBee: Bee; { создать два экземпляра Bee } begin FBee.Init(5, 9) { вызов конструктора для FBee } GBee := FBee; { Gbee недопустим! } end; Что же именно создает конструктор? Каждый тип объекта содер- жит нечто, называемое таблицей виртуального метода (ТВМ) в сег- менте данных. ТВМ содержит размер типа объекта и для каждого вир- туального метода указатель на код, выполняющий данный метод. Конструктор устанавливает связь между вызывающей его реализацией объекта и ТВМ типа объекта.

Важно помнить, что имеется только одна ТВМ для каждого типа объекта. Отдельные экземпляры типа объекта (т.е. переменные этого типа) содержат только соединение с ТВМ, но не саму ТВМ. Конструк- тор устанавливает значение этого соединения в ТВМ. Именно благо- даря этому вы нигде не можете запустить выполнение перед вызовом конструктора.




Содержание  Назад  Вперед