Пример описания виртуального метода

Вопрос

Public

Private

t:integer;

n,m,f:integer;

end;

implementation

uses Unit2;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);

begin

t:=2;

n:=2;

m:=2;

form2.show;

end;

end.

unit Unit2;

uses Unit1;

procedure TForm2.Button1Click(Sender: TObject);

var i:integer;

begin

i:=Form1.n*Form1.m;

Edit1.Text:=IntToStr(i);

end;

end.

Рисунок 4 – Вид окна модуля в Delphi

 

 

Виртуальные методы. Отличие виртуальных и динамических методов. Правила вызова виртуальных методов. Привести пример объявления виртуального метода.

 

Виртуальный метод (виртуальная функция) – в объектно-ориентированном программировании метод (функция) класса, который может быть переопределён в классах-наследниках так, что конкретная реализация метода для вызова будет определяться во время исполнения. Таким образом, программисту необязательно знать точный тип объекта для работы с ним через виртуальные методы: достаточно лишь знать, что объект принадлежит классу или наследнику класса, в котором метод объявлен.

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

Метод становится виртуальным, если за его объявлением в типе объекта стоит зарезервированное слово VIRTUAL. Необходимо помнить, что если метод объявлен в родительском типе как VIRTUAL, то все методы с аналогичными именами в дочерних типах также должны объявляться виртуальными, во избежание ошибки компилятора.

Procedure <имя метода>(<список параметров>); virtual;

Function <имя метода> (<список параметров>):<тип функции>; virtual;

При использовании виртуальных методов должны выполняться следующие правила.

1) Если в некотором классе метод описан как виртуальный, то все производные классы, включающие метод с тем же именем, должны описать этот метод как виртуальный. Нельзя заменить виртуальный метод статическим.

2) Порядок расположения, количество и типы формальных параметров в одноименных виртуальных методах должны оставаться неизменными.

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

Если объявляется виртуальные метод в каком-либо родительском типе, то это накладывает следующие ограничения на его дочерние типы:

­ все методы дочерних типов одноименные с виртуальными родительскими, так же обязаны быть виртуальными;

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

Метод, при определении которого в наследуемом классе было указано ключевое слово virtual и который был переопределен в одном или более наследующих классах, называется виртуальным методом. Следовательно, каждый наследующий класс может иметь собственную конкретизацию виртуального метода.

При определении виртуального метода в составе наследуемого класса перед типом возвращаемого значения указывается ключевое слово virtual, а при переопределении виртуального метода в наследующем классе используется модификатор override.

Виртуальный метод не обязательно должен быть переопределенным (overridden). Если наследующий класс не предоставляет собственную версию виртуального метода, то используется метод наследуемого класса.

Переопределение метода положено в основу концепции динамического выбора вызываемого метода. Выбор вызываемого переопределенного метода осуществляется во время выполнения программы, а не во время ее компиляции.

 

 

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

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

type

TPerson=class

fname:string;{ имя }

constructor Create (name:string) ;

function info: string; virtual;

end;

TStud=class(TPerson)

fgr:integer; { номер группы}

constructor Create(name:string;gr:integer);

function info:string; override;

end;

В каждом из этих классов определен метод info. В базовом классе при по­мощи директивы virtual метод info объявлен виртуальным. Объявление метода виртуальным дает возможность дочернему классу произвести замену виртуального метода своим собственным. В каждом дочернем классе опре­делен свой метод info, который замещает соответствующий метод родитель­ского класса (метод порожденного класса, замещающий виртуальный метод родительского класса, помечается директивой override).