在定义T2类时,引用了另一个类T1,如何书写构造和析构涵数?(10分)

  • 主题发起人 主题发起人 mycwcgr
  • 开始时间 开始时间
M

mycwcgr

Unregistered / Unconfirmed
GUEST, unregistred user!
下面在定义T2类时,引用了另一个类T1,如何书写构造和析构涵数?
A: 下面有三个写法,请问谁对,为什么?或者您认为应该如何书写。
(
方法1:[Warning] Unit1.pas(17): Method 'Destroy' hides virtual method of base type 'TObject'
方法2:
方法3:[Error] Unit1.pas(15): Cannot override a static method [Error] Unit1.pas(43): Incompatible types [Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
)
B: 另外T2类的destructor destroy;
是否是必须的?
在T2类的对象free时,是否自动将其中的T1类的dimT1对象free掉?

=================================1===================================
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type t1=class
index:integer;
stemp:string;
end;

type t2=class
total:integer;
dimT1:array of t1;
public
constructor create(input:integer);
destructor destroy;
end;

type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
constructor t2.create(input: integer);
var
i:integer;
begin
total:=input;
setlength(dimt1,total);
for i:=0 to total-1 do
begin
dimt1.Create;
end;
end;

destructor t2.destroy;
var
i:integer;
begin
for i:=0 to total-1 do
begin
dimt1.Create;
end;
end;

end.

=================================2====================================
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type t1=class
index:integer;
stemp:string;
end;

type t2=class
total:integer;
dimT1:array of t1;
public
constructor create(input:integer);
destructor destroy;override;
end;

type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}

constructor t2.create(input: integer);
var
i:integer;
begin
total:=input;
setlength(dimt1,total);
for i:=0 to total-1 do
begin
dimt1.Create;
end;
end;

destructor t2.destroy;
var
i:integer;
begin
inherited;
//自动加上去的
for i:=0 to total-1 do
begin
dimt1.Create;
end;
end;

end.

===========================================3===========================================
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type t1=class
index:integer;
stemp:string;
end;

type t2=class
total:integer;
dimT1:array of t1;
public
constructor create(input:integer);override;
destructor destroy;override;
end;

type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}

constructor t2.create(input: integer);
var
i:integer;
begin
inherited;
total:=input;
setlength(dimt1,total);
for i:=0 to total-1 do
begin
dimt1.Create;
end;
end;

destructor t2.destroy;
var
i:integer;
begin
inherited;
//自动加上去的
for i:=0 to total-1 do
begin
dimt1.Create;
end;
end;

end.

 
都不对。
第三个把create后的override去掉就对了。
TObject的Destroy是虚方法,必须override
而Create不是,所以不能显示地override,需在实现中用inherited调用
祖先的构造函数。
 
To Another_eYes,
另外T2类的destructor destroy;
是否是必须的?
在T2类的对象free时,是否自动将其中的T1类的dimT1对象free掉?
 
必须。
不会。
 
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
type t1=class
index:integer;
stemp:string;
end;

type t2=class
total:integer;
dimT1:array of t1;
public
constructor create(input:integer);
destructor destroy;Override;
//TObject类的destroy方法是动态方法,如果定义的话,必须重载,在t2中它主要要完成
//销毁T1,所以这里必须写这个函数.且必须Override.
end;
type
TForm1 = class(TForm)
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
implementation
{$R *.DFM}
constructor t2.create(input: integer);
var
i:integer;
begin
inherited;
//这里必须重用父类的Create函数.
total:=input;
setlength(dimt1,total);
for i:=0 to total-1 do
begin
dimt1.Create;
end;
end;

destructor t2.destroy;
var
i:integer;
begin
for i:=0 to total-1 do
begin
dimt1.Free;
//不明白的是这里为什么是Create还要创建每个元素,应该是:
//dimt1.Free;
end;
inherited;
//这里必须重用父类的destroy函数.
end;

end.
 
To aizb:
constructor t2.create(input: integer);
var
i:integer;
begin
inherited;
//这里必须重用父类的Create函数.
total:=input;
setlength(dimt1,total);
for i:=0 to total-1 do
begin
dimt1.Create;
end;
end;

上面的 inherited;语句是必须的吗?没有这一句好象也没出错
并且用Ctrl+Shift+C系统自动创建的语句中也没有inherited;语句!
 
必须,而且需要inherited Create;而不能仅仅是inherited;因为你的Create函数有参数,与父类的Create函数不一样.
TObject类的Create尽管没有做任何事(在System单元中),但是实际上编译器会编译进很多代码,如果不inherited,不一定会立即出错,但是会有一些潜在的问题.
 
不会有潜在的问题。
TObject.Create本来就是用来给继承类Hide的。
可以说留着它只是为了语法上看上去更严谨吧。
因为TObject.Create真的什么都不做的。
真正起作用的不是Create而是Constructor关键字。 delphi编译器对这个关键字的代码插了很多隐藏的初始化工作。
 
多人接受答案了。
 
后退
顶部