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

Var I:integer; s:real;

Begin s:=0;

for i:=1 to n do s:=s+rooms[i].square;

square:=s;

End;

Constructor TFlat.Init(nn:integer;c:real;Var mas);

Var I:integer;

m:array[1..10] of RRoom absolute mas;

Begin n:=nn;

cost:=c;

for i:=1 to n do

rooms[i].Init(0,m[i].length,m[i].wight);

End;

Const mr:array[1..3] of RRoom=((length:3;wight:3),

(length:4;wight:4),

(length:3;wight:5));

Var a:tRoom; b:tFlat;

Begin A.Init(50,5,6);

B.Init(3,60,mr);

WriteLn(A.price);

WriteLn(B.price);

End.

В приведенном примере объекты-потомки «Комната» и «Квартира» используют метод определения стоимости объекта-родителя «Помещение», но каждый раз при определении стоимости функция определения площади вызывается для соответствующего объекта-потомка, так как эта функция является полиморфной и виртуальной.

При определении того, какой (статический или виртуальный) метод использовать при решении задачи следует иметь в виду, что:

  1. виртуальные методы занимают больше памяти (из-за ТВМ);

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

  3. полиморфная функция не может содержать и статические и виртуальные аспекты одновременно;

  4. списки параметров статических аспектов полиморфного метода могут различаться, а виртуальных - нет;

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

При необходимости программист может определить тип объекта, с которым в настоящий момент времени работает виртуальный метод. Для этого используется стандартная функция Паскаля TypeOf(TObj), которая для объектов возвращает адрес ТВМ. Сравнив этот адрес с адресом интересующего нас типа, мы определим тип объекта, с которым работает метод:

if TypeOf(Self)=TypeOf(TA) then ...

. Динамические объекты. Деструкторы.

Объектные переменные во многом подобны обычным, в частности, их можно размещать в динамической памяти. Для выделения памяти экземпляру объекта можно использовать специальный вариант функции или процедуры New.

Процедура: New(<указатель на объект>[,<имя конструктора>]);

Функция:

<указатель на объект>:= New(<тип объекта>[,<имя конструктора>])

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

Для освобождения памяти при уничтожении динамического экземпляра объекта используется процедура

Dispose(<указатель на объект>,[<имя деструктора>]);

Деструктор - это специальная процедура, при описании которой служебное словоProcedure заменяется служебным словомDestructor (так же как и для конструктора, для деструктора существует рекомендованное имя -Done). Деструктор используется для определения действий, которые необходимо выполнить перед уничтожением объекта.Если динамический объект использует виртуальные методы, то использование деструктора обязательно. Обычно деструктор определяет действия по освобождению памяти, распределенной для размещения динамических полей, как статических, так и динамических объектов, но может и не содержать выполняемых операторов.

Пример 7.Динамический объект со статическим полем без деструктора.

Program ex;

Type pTObj=^TObj; {объявление указателя на объект}

TObj=Object {определение объекта}

pole:real; {статическое поле}

procedure Print; {статическая процедура печати}

constructor Init(p:real); {конструктор}

end;

Procedure TObj.Print;

Begin WriteLn('Значение поля = ',pole); end;

Constructor TObj.Init(p:real);

Begin pole:=p; end;

Var p:pTObj; {объявление переменной типа «указатель на объект»}

Begin New(p,Init(5)); {выделение памяти и инициализация поля}

p^.Print;

Dispose(p); {освобождение памяти}

End.

Пример 8.Динамический объект с динамическим полем и деструктором.

Program ex;

Type pTObj=^TObj;

TObj=Object

pPole:^real; {динамическое поле}

procedure Print;

constructor Init(p:real); {конструктор}

destructor Done; {деструктор}

end;

Procedure TObj.Print;

Begin WriteLn('Значение поля = ',pPole^); end;

Constructor TObj.Init(p:real);

Begin New(pPole); {выделение памяти под дин. поле}

pPole^:=p;

end;

Destructor TObj.Done;

Begin Dispose(pPole); {освобождение памяти}

end;

Соседние файлы в папке Методичка С++