Демонстрация полиморфизма и виртуальных методов — Pascal(Паскаль)

program polivir;
uses Crt;
const
   LENLIST=10;  { длина списка }
type

   TPerson = object
      FName: string[30];     { имя   }
      FAddress: string[40];  { адрес }
      constructor init(Name,Address:string); { конструктор объекта }
      destructor  Done; virtual;             { деструктор объекта  }
      procedure print; virtual;
   end;

   TStudent = object(TPerson)
      FGroup: integer;       { учебная группа }
      constructor init(Name,Address:string;Group:integer);
      destructor  Done; virtual;
      procedure print; virtual;
   end;

   TProf = object(TPerson)
      FKafedra: string[30];  { кафедра }
      constructor init(Name,Address,Kafedra:string);
      destructor  Done; virtual;
      procedure print; virtual;
   end;

   PStudent=^TStudent;
   PProf=^TProf;

constructor TPerson.init(Name,Address:string);
   begin
     FName:=Name;
     FAddress:=Address;
   end;

destructor TPerson.Done;
begin
end;

procedure TPerson.print;
   begin
      writeln(FName);
      writeln(FAddress);
   end;

constructor TStudent.init(Name,Address:string;Group:integer);
   begin
     TPerson.init(Name,Address);
     FGroup:=Group;
   end;

destructor TStudent.Done;
begin
   inherited Done; { вызов деструктора родительского типа }
end;

procedure TStudent.print;
   begin
      TPerson.print;
      writeln('гр. ',FGroup);
   end;

constructor TProf.init(Name,Address,Kafedra:string);
   begin
     TPerson.init(Name,Address);
     FKafedra:=Kafedra;
   end;

destructor TProf.Done;
begin
   inherited Done;
end;

procedure TProf.print;
   begin
      TPerson.print;
      writeln('каф. ',FKafedra);
   end;

var
   list: array[1..LENLIST] of ^TPerson;
   i:integer;

begin
   { инициализация списка }
   for i:=1 to LENLIST do
       list[1]:=NIL;

   { создать три объекта и поместить в список }
   list[1]:=new(PStudent,init('Михаил Иванов','Лесной пр, д.29, корп.6ф, комн.211',3813));
   list[2]:=new(PStudent,init('Цветков Станислав','пр. К.Маркса, д.32, кв.3',3813));
   list[3]:=new(PProf,init('Некрасов Степан Петрович','Институтский пр., д.7, кв.13','Управление проектами'));

   { вывести объекты - элементы списка }
   for i:=1 to LENLIST do
      if list[i] <> NIL
         then list[i]^.print;

   { уничтожить объекты }
   for i:=1 to LENLIST do
      if list[i] <> NIL
         then
            begin
              Dispose(list[i],Done);
              list[i]:=NIL;
            end;

   Readln;

end.

Leave a Comment

63 − 56 =