78197

Инициализация и разрушение объектов. Виртуальная функция

Лекция

Информатика, кибернетика и программирование

В программе концепция полиморфизма реализуется при помощи виртуальных методов. Виртуальный метод объявляется в базовом объектном типе и в порожденных от базового типах. После его объявления должно быть помещено зарезервированное слово virtual.

Русский

2015-02-07

68.5 KB

1 чел.

екция: Инициализация и разрушение объектов. Виртуальная функция                                   8 из 8 с

Оглавление

[0.1] ООП: инициализация и разрушение объекта (конструктор и деструктор),
виртуальные методы.

[0.1.1] Виртуальные функции

[0.1.2] Конструктор

[0.1.3] Деструктор

[0.1.4] Контрольные вопросы

 Лекция №№29-30

ООП: инициализация и разрушение объекта (конструктор и деструктор),
виртуальные методы.
 

Виртуальные функции

В программе концепция полиморфизма реализуется при помощи виртуальных методов. Виртуальный метод объявляется в базовом объектном типе и в порожденных от базового типах. После его объявления должно быть помещено зарезервированное слово virtual.

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

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

Рассмотрим пример 2, указанный ниже. Объектовые типы Tp и Tc содержат поля и методы для рисования, стирания и передвижения точек и окружностей на экране дисплея. Эти два объектовых типа связаны отношениями наследования и содержат одноимённые методы Show (нарисовать), Hide (удалить с экрана) и Moveto (передвинуть). Для различных   геометрических фигур алгоритмы методов Show и Hide существенно отличаются. Алгоритм метода Moveto для обеих фигур одинаков (удалить фигуру со старого места, изменить координаты размещения фигуры и нарисовать ту же фигуру на новом месте).

Естественным является желание определить метод Moveto для объектового типа Tp и наследовать этот метод без переопределения во всех типах объектов-потомков. Поясним невозможность такого подхода в данной проблеме без дополнительных затрат.

Допустим, что метод Moveto определён только в объектовом типе Tp. Если имеются экземпляры двух объектов: var P : Tp; C : Tc;, то вызов метода P.Moveto начнёт своё выполнение с метода Tp.Hide. Последующие действия метода Moveto приведут к ожидаемому результату. Теперь рассмотрим вызов C.Moveto. Экземпляр типа-потомка вызывает унаследованный метод Moveto, который жёстко связан с методами Tp.Show и Tp.Hide. Методы Show, Hide, Moveto были откомпилированы в одном контексте – в одном объектовом типе Tp . Поэтому метод Moveto всегда будет вызывать методы Tp.Show и Tp.Hide. Связь этих методов является статической, так как она была определена при компиляции. Методы С.Show и С.Hide вызваны не будут. Вызов С.Moveto приведёт к перемещению точки.

Если мы хотим иметь один метод Moveto для различных объектов, необходимо разорвать статическую связь этого метода с методами Show иHide и обеспечить возможность для метода Moveto вызывать либо методы Tp.Show и Tp.Hide, либо .Show и .Hide в зависимости от того, какой объект вызывает метод Moveto. Такой механизм называют динамическим или поздним связыванием в отличие от статического или раннего связывания. Он достигается введением виртуальных методов.

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

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

1) если прародительский объектовый тип описывает метод как виртуальный, производные типы метод с тем же именем также должны описывать как виртуальный;

2) заголовок в заново определённом виртуальном методе не может быть изменён;

3) если объектовый тип содержит виртуальный метод, он должен содержать хотя бы один метод-конструктор;

4) метод-конструктор должен быть применён к экземпляру объекта до первого вызова виртуального метода;

5) каждый экземпляр объекта должен быть инициализирован отдельным вызовом конструктора;

6) сам конструктор не может быть виртуальным.

Конструктор

Конструктор – это особый метод, который позволяет выполнять некоторую работу, обеспечивающую поддержку механизма виртуальных методов. Он должен вызываться раньше других методов объекта, т.к. он выполняет инициализацию объекта. Вместо слова «procedure» в объявлении объектных типов используется «constructor».

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

Для создания объектов используется расширенный синтаксис вызова функции new, который позволяет выделить память для объекта и инициализировать объект с помощью вызова конструктора. Общий вид инструкции:

Указатель:=new(ТипОбъекта, КонстукторОбъекта);

Деструктор

Для уничтожение объекта служит деструктор. Деструктор объявляется с помощью зарезервированного слова destructor, после которого идет имя деструктора. Деструктор ничего не возвращает и не имеет параметров.

Т.к. объект представляет собой сложную структуру, то рекомендуется использовать метод Done. Метод Done оформляется как деструктор – особая процедура, выполняющая специфическую работу, в том числе обеспечивающая объединение освобождающихся, возможно, небольших участков памяти в более крупные блоки. 

Инструкция Dispose(p,Done); уничтожает объект, на который указывает P.

На практике в качестве конструктора используют метод, устанавливающий начальные значения экземпляра объекта. В частности, конструктор может быть пустым. В рассмотренном примере конструктором является метод Init. Конструктор – это обычный метод-процедура, в котором служебное слово procedure заменено на constructor. Он помимо действий, заданных в его теле, выполняет установочную работу для механизма виртуальных методов, обеспечивая вызов в процессе выполнения программы именно того виртуального метода, который определён для вызывающего объекта. В примере 2 один и тот же метод Moveto будет работать по-разному (передвигать различные фигуры) в зависимости от того, экземпляр какого объектового типа этот метод вызывает. Такое свойство называется полиморфизмом.

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

Текст программы примера 2, использующий виртуальные методы, может быть следующим:

Uses Crt, Graph;

Var gd,gm : integer;

Type Tp=Object

X,y,c : integer;

Constructor Init(ax,ay,ac : integer);

Procedure Show; Virtual;

Procedure Hide; Virtual;

Procedure Moveto(dx,dy : integer);

End;

Constructor Tp.Init;

Begin X:=ax; y:=ay; c:=ac   End;

Procedure Tp.Show;

Begin Putpixel(x,y,c); End;

Procedure Tp.Hide;

Begin Putpixel(x,y,Getbkcolor) End;

Procedure Tp.Moveto;

Begin

Delay(1000); Hide;

X:=x+dx; y:=y+dy; Show

End;

Type Tc=Object(Tp)

R : integer;

Constructor Init(ax,ay,ac,ar : integer);

Procedure Show; Virtual;

Procedure Hide; Virtual;

End;

Constructor Tc.Init;

Begin Inherited(ax,ay,ac); R:=ar  End;

Procedure Tc.Show;

Begin

Setcolor(c); Circle(x,y,r)

End;

Procedure Tc.Hide;

Begin

Setcolor(Getbkcolor); Circle(x,y,r)

End;

Var P : Tp;  C : Tc;

Begin

Gd:=Detect;

Initgraph(Gd,Dm,’c:\bp\bgi’);

P.Init(100,120,yellow);

P.Show; P.Moveto(50,50);

Readln;

C.Init(200,300,Green,150);

C.Show; C.Moveto(10,10);

Readln;

Closegraph

End.

Пример 3. Приведём пример использования виртуальных методов при работе с вектором и матрицей (предусмотрим ввод значений элементов рассматриваемой структуры данных, нахождение в структуре элемента с минимальным значением и вывод результата).

const nmax=10;

type tvect = array[1..nmax] of real;

tmatr = array[1..nmax,1..nmax] of real;

vect = object

n:integer;{фактический размер вектора, количество строк матрицы }

min : real;

a     : tvect;

constructor init;

procedure inpt ; virtual; {ввод}

procedure obr ; virtual; {нахождение минимального элемента}

procedure out; {вывод}

procedure work;{полная обработка структуры данных}

end;

constructor vect.init; begin end;

procedure vect.inpt;

var i : integer;

begin

writeln('n=?'); readln(n);

for i:=1 to n do

begin

write('a[i]-?'); readln(a[i])

end;

end;

procedure vect.obr;

var i : integer;

begin

min:=a[1];

for i:=2 to n do

if a[i]<min then min:=a[i]

end;

procedure vect.out;

begin writeln('min=',min:7:3) end;

procedure vect.work;

begin inpt; obr; out end;

type matr=object(vect)

m : integer; {количество столбцов матрицы}

b : tmatr;

procedure inpt; virtual;{ввод}

procedure obr; virtual;{нахождение мин. элемента}

end;

procedure matr.inpt;

var i,j : integer;

begin

writeln('n,m=?'); readln(n,m);

for i:=1 to n do

for j:=1 to m do

begin

writeln('b[i,j]=?'); readln(b[i,j])

end;

end;

procedure matr.obr;

var i,j : integer;

begin

min:=b[1,1];

for i:=1 to n do

for j:=1 to m do

if b[i,j]<min then min:=b[i,j]

end;

var ObjVect : vect;

   ObjMatr : matr;

begin

 ObjVect.init;

 ObjVect.work;

 ObjMatr.init;

 ObjMatr.work;

readln

 end.

Пример 4. Приведём пример реализации в виде объекта списка целых чисел. В качестве методов будем использовать следующие: инициализацию списка, добавление в список элемента с заданным значением, обработку элементов списка (печать) и  метод, предназначенный для освобождения ранее выделенной памяти.

Type Link=^Rec;

Rec=Record

Inf : Integer;

Next : Link

End;

Tsp=Object

Start : Link;

Procedure Init;

Procedure In_Spisok(X:integer);

Procedure Print_Spisok;

Procedure Done;

End;

Procedure Tsp.Init; Begin Start:=Nil End;

Procedure Tsp.In_Spisok;

Var p : Link;

Begin

New(p);   

P^.inf:=x;   P^.next:=Start;

Start:=p

End;

Procedure Tsp.Print_Spisok;

Var p : Link;

Begin

P:=Start;

While p<>Nil do

Begin

Write(P^.inf:6);

P:=P^.next

End;

End;

Procedure Tsp.Done;

Var p : Link;

Begin

While Start<> Nil do

Begin

P:=Start;

Start:=Start^.next;

Dispose(p)

End

End;

Var Spisok : Tsp;

A : integer;

Ch : char;

Begin

Spisok.Init;

Repeat

Readln(A);

Spisok.In_Spisok(A);

Readln(Ch);

Until Ch in [‘n’,’N’];

Spisok.Print_Spisok;

Spisok.Done

End.

Контрольные вопросы

  1.  Опишите структуру объекта.
  2.  Дайте определению понятиям «конструктор», «деструктор».
  3.  Дайте определение понятию «виртуальная функция».


 

А также другие работы, которые могут Вас заинтересовать

73258. РАЗРАБОТКА АССОРТИМЕНТА СУПОВ В МИРОВОЙ КУХНЕ 987.72 KB
  Супы широко распространенные блюда. Сначала жидкие блюда русской кухни называли похлебками. Вначале им называли чужеземные жидкие блюда но позднее распространили и на национальные похлебки. Многие страны имеют свои национальные первые блюда в большинстве случаев являющиеся супами.
73259. Исследование распределений температуры в полосковых проводниках 456.58 KB
  Измерение теплового поля тонких полосковых проводников может быть осуществлено различными методами, каждый из которых связан с некоторыми трудностями. Контактный метод измерения не подходит, так как высока теплоемкость контактирующего материала. Для измерения теплового поля хорошо подходит пирометрический метод, но для проведения измерений необходимо подготовить исследуемый объект
73260. Особенности религиозного и религиоведческого образования в государственных образовательных учреждениях РФ 80.52 KB
  Причины введения курса основы религиозных культур и светской этики в современных школах. Цели и задачи курса. Целью учебного курса ОРКСЭ является формирование у младшего подростка мотиваций к осознанному нравственному поведению основанному на знании и уважении культурных и религиозных традиций многонационального народа России а также к диалогу с представителями других культур и мировоззрений. Реализация этих целей в культурологических религиоведческих курсах.
73262. Высокоскоростной наземный транспорт 31.62 KB
  Движение таких поездов как правило осуществляется по специально выделенным железнодорожным путям высокоскоростной магистрали ВСМ либо на магнитном подвесе Маглев. Благодаря быстроте обслуживания и высокой скорости движения они составляют серьёзную конкуренцию другим видам транспорта сохраняя при этом такое свойство всех поездов как низкая себестоимость перевозок при большом объёме пассажиропотока. Впервые регулярное движение высокоскоростных поездов началось в 1964 году в Японии по проекту Синкансэн.
73263. ЭКОНОМИКА ПРЕДПРИЯТИЯ 916.5 KB
  Дисциплина Экономика предприятия входит в блок общепрофессиональных экономических дисциплин. Методические рекомендации разработаны на основе программы Экономика предприятия призвана помочь студенту более глубоко изучить теоретические и практические вопросы связанные с экономической сферой деятельности предприятия законодательноправовые и нормативные документы в данной области выработать...
73264. РЕКОНСТРУКЦИЯ РАЙОНА ЖИЛОЙ ЗАСТРОЙКИ 49.75 MB
  Цель и задачи курсового проекта Цель курсового проекта разработка проекта реконструкции района жилой застройки. В содержание работы по курсовому проектированию входит решение следующих задач: проведение общего обследования жилой застройки: Сбор исходной информации о жилой застройке посредством проведения натурных изысканий; Построение картограммы жилищного фонда; Разработка возможных реконструктивных мероприятий; Построение картограммы возможных реконструктивных мероприятий...