6.5.3 Виртуальные методы

На верх  Назад  Вперёд

Классы, так же, как объекты могут иметь виртуальные методы. Однако между ними существует разница. Для объекта, достаточно пере объявить метод в объекте потомке с ключевым словом virtual, чтобы заменить его. Для класса, ситуация иная: виртуальные методы должны быть перекрыты с ключевым словом override. Несоблюдение этого правила, начнет новую серию виртуальных методов, скрывая предыдущую. Ключевое слово Inherited не будет вызывать метод предка, если были использованы virtual (виртуальные) методы.

Следующий код является неправильным:

Type

ObjParent = Class

  Procedure MyProc; virtual;

end;

 

ObjChild = Class(ObjPArent)

  Procedure MyProc; virtual;

end;

Компилятор выдаст предупреждение:

Warning: An inherited method is hidden by OBJCHILD.MYPROC

Внимание: унаследованный метод скрыт OBJCHILD.MYPROC

Это код будет компилироваться, но с Inherited (унаследованными) методами будут происходить странные вещи.

Правильным объявлением классов, будет так:

Type

ObjParent = Class

  Procedure MyProc; virtual;

end;

 

ObjChild = Class(ObjPArent)

  Procedure MyProc; override;

end;

Этот код будет компилироваться и запускаться без предупреждений или ошибок.

Если виртуальный метод действительно следует заменить методом с тем же именем, то нужно использовать ключевое слово reintroduce:

Type

ObjParent = Class

  Procedure MyProc; virtual;

end;

ObjChild = Class(ObjPArent)

  Procedure MyProc; reintroduce;

end;

Метод MyProc больше не быдет виртуальным.

Для того, чтобы быть в состоянии сделать это, компилятор сохраняет для каждого класса - таблицу с виртуальных методов:VMT (Virtual Method Table ). Это таблица с указателями на каждый из виртуальных методов: каждый виртуальный метод имеет фиксированное положение в этой таблице (индекс). Компилятор использует эту таблицу, чтобы определить, какой метод будет фактически использоваться во время выполнения. Когда объект потомка переопределяет метод, в VMT переписывается родительский метод. Более подробную информацию о VMT можно найти в Справочник программиста Free Pascal.

Примечание:

Ключевое слово virtual (виртуальный) можно заменить на ключевое слово dynamic (динамический):динамические методы ведут себя так же, как виртуальные методы. В отличие от Delphi, в FPC реализация динамических методов сделана также как и реализация виртуальных методов.