Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.10.2010, 11:00   #1
Rusl92
Форумчанин
 
Аватар для Rusl92
 
Регистрация: 30.03.2008
Сообщений: 392
По умолчанию Наследование (классы)

Здравствуйте, уважаемые форумчане!
У меня к вам вопрос, почему Делфи выдает сообщение об ошибке при запуске программы

Код:
Access violation at address 004619AB in module 'Project1.exe'. Write of address 00000004
Unit2

Код:
unit Unit2;

interface
uses  SysUtils,Dialogs;
 type
  TMyPoint = class
    protected
     PointX,PointY:Integer;
    public
     constructor Create(x,y:integer);virtual;
     procedure Draw; virtual;
  end;
  TMyLine = class(TMyPoint)
     protected
      PointX1, PointY1:integer;
     public

      constructor Create(x,y,x1,y1:integer);reintroduce;
      procedure Draw;override;
  end;
implementation

constructor TMyPoint.Create(x: Integer; y: Integer);
begin
   PointX:=x;
   PointY:=y;
end;
procedure TMyPoint.Draw;
begin
  ShowMessage(IntToStr(PointX)+' '+IntToStr(PointY));
end;


constructor TMyLine.Create(x: Integer; y: Integer; x1: Integer; y1: Integer);
begin
  inherited Create(x,y);
  PointX1:=x1;
  PointY1:=y1;
end;
procedure TMyLine.Draw;
begin
   ShowMessage(IntToStr(PointX)+' '+IntToStr(PointY)+' '+IntToStr(PointX1)+' '+IntToStr(PointY1));
end;


end.
Далее Unit1

Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs,Unit2;

type
  TForm1 = class(TForm)
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;


var
  Form1: TForm1;
  Line: TMyLine;
  Point:TMyPoint;
implementation

{$R *.dfm}

procedure TForm1.FormCreate(Sender: TObject);
begin

    Line.Create(1,2,3,4);
    Line.Draw;
end;

end.

и вообще правильны ли мои знания в теории

1) если пишем reintroduce после метода - то мы сможем затем написать
inherited и вызвать (в данном случае) конструктор предка
2) если же мы пишем override после метода - мы полностью перекрываем виртуальный метод предка и затем не сможем вызвать его

Заранее спасибо!
Программирование - это великое искусство... Такое же как например и живопись!

Последний раз редактировалось Rusl92; 31.10.2010 в 11:16.
Rusl92 вне форума Ответить с цитированием
Старый 31.10.2010, 14:36   #2
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

[CODE]
Код:
procedure TForm1.FormCreate(Sender: TObject);
begin
    line:=TMyLine.Create;
    Line.Create(1,2,3,4);
    Line.Draw;
end;
Код:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

  TBas=class
  public
    function F1: string; virtual;
    function F2: string; virtual;
  end;

  TClas=class(TBas)
  public
    function F1: string; override;
    function F2: string; override;
  end;

  TRclas=class(TBas)
  public
    function F1: string; reintroduce;
    function F2: string; reintroduce;
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

{ TBas }


{ TBas }

function TBas.F1: string;
begin
  result:=#13#10'TBas.F1';
end;

function TBas.F2: string;
begin
  result:=#13#10'TBAs.F2';
end;

{ TClas }

function TClas.F1: string;
begin
  result:=inherited F1 +#13#10'TClas.F1';
end;

function TClas.F2: string;
begin
  result:=#13#10'TClas.F2';
end;

{ TRclas }

function TRclas.F1: string;
begin
  result:=inherited F1 + #13#10'TRclas.F1';
end;

var
  r1: Tbas;
  r2: TClas;
  r3: TRclas;
procedure TForm1.Button1Click(Sender: TObject);
begin
  r1:=Tbas.Create;
  showmessage('var: TBas TBas.Create' + r1.f1);
  r1:=TClas.Create;
  showmessage('var: TBas Tclas.Create'+ r1.F1);
  r1:=TRclas.Create;
  showmessage('var: TBas TBas.Create' + r1.F1);

  r2:=TClas.Create;
  ShowMessage('var: TClas TClas.Create' + r2.F1);
  r3:=TRclas.Create;
  showmessage('var: TRclas TRclas.Create' + r3.F1);
end;

function TRclas.F2: string;
begin
  result:=#13#10'TRclas.F2';
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  r1:=Tbas.Create;
  showmessage('var: TBas TBas.Create' + r1.f2);
  r1:=TClas.Create;
  showmessage('var: TBas TBas.Create' + r1.F2);
  r1:=TRclas.Create;
  showmessage('var: TBas TBas.Create' + r1.F2);

  r2:=TClas.Create;
  ShowMessage('var: TBas TBas.Create' + r2.F2);
  r3:=TRclas.Create;
  showmessage('var: TBas TBas.Create' + r3.F2);
end;
override; reintroduce; определяет какой из методов будет вызван при использовании переменной базового класса (var r1: Tbas) в которую будет записан объект дочернего класса. r1:=Tclas.create;

inherited можно писать (а можно не писать) для любых методов базового класса.(сравни определения F1и F2)
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 31.10.2010 в 14:41.
evg_m на форуме Ответить с цитированием
Старый 31.10.2010, 17:28   #3
Rusl92
Форумчанин
 
Аватар для Rusl92
 
Регистрация: 30.03.2008
Сообщений: 392
По умолчанию

override; reintroduce; определяет какой из методов будет вызван при использовании переменной базового класса (var r1: Tbas) в которую будет записан объект дочернего класса. r1:=Tclas.create;
ничего не понял из этих слов
а то. что inherited можно везде писать понял


так чем отличается override от reintroduce???
вообще зачем они - если можно написать просто без них
Обьясните пожалуйста... очень важно!
Программирование - это великое искусство... Такое же как например и живопись!
Rusl92 вне форума Ответить с цитированием
Старый 31.10.2010, 20:31   #4
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

override указывает что данная процедура "замещает" соответствующую процедуру базового класса. В переменной базового класса с объектом класса наследника будет использоваться процедура наследника.
reintroduce указывает что наследование не должно проводиться. В переменной базового класса с объектом класса наследника будет использоваться базовая процедура.
возьми новый проект, добавь две кнопки,скопируй классы и обработчики нажатий кнопок (из моего предыдущего поста). Запусти программу, понажимай кнопки и посмотри что она выдает. Обращай внимание какого класса переменная и какого класса в этой переменной объект. Где-то строка только базового класса,где-то и базового и дочернего, где-то только дочернего.
программа — запись алгоритма на языке понятном транслятору
evg_m на форуме Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
классы.наследование.жидкости zhenya.ya Общие вопросы C/C++ 8 23.10.2010 14:13
C++ Классы (Наследование) werser Помощь студентам 3 15.12.2009 21:30
Классы(абстрактный и наследование) Пепел Феникса Общие вопросы C/C++ 6 02.11.2009 01:18
Классы и наследование. Scratch Общие вопросы C/C++ 9 27.09.2008 16:03