Create的困惑 (25分)

  • 主题发起人 主题发起人 lidongbao
  • 开始时间 开始时间
L

lidongbao

Unregistered / Unconfirmed
GUEST, unregistred user!
Create在TObject中的定义为:
constructor Create;
destructor Destroy
virtual;
对比Destroy 函数,说明它是一个Static函数,为何在子类中可以override?
若它是virtual函数,为何在TObject中定义时没有加上virtual?
谢谢大家给予帮助!!!
 
不加virtual不可以重载吗?
 
你怎么查看定义的?
 
一般子类并没有重载缺省的Create,关键是Constructor可以有多个
Constructor Create;
Constructor Create( AOwner: TComponent );
........
如果子类的Constructor与父类恰好相同,delphi会发出提示,可以用reintroduce关键字将
提示消除
Constructor Create
reintroduce

........
 
并不是重写,而是被覆盖了.
type
TMyObj = class(TObject)
public
constructor Create;
end;
constructor TMyObj.Create;
begin
ShowMessage('MyObj Created');
end;
如果这样去创建:
var
aClass:TClass;
aObj:TObject;
begin
aClass := TMyObj;
aObj := aClass.Create;//换成aObj := TMyObj.Create试试:不一样吧!
end;
就不会显示信息,说明TMyObj的构造函数并没有被调用,也就是说,不能在不知道创建的类是哪一个时去通过一个普通构造函数创建它.
现在在做个试验:
type
TBaseObj = class(TObject)
public
constructor VCreate;virtual;
end;
TMyObj = class(TBaseObj)
public
constructor VCreate;override;
end;
TBaseClass = class of TBaseObj;
constructor TBaseObj.VCreate;
begin
end;
constructor TMyObj.VCreate;
begin
ShowMessage('MyObj Created!');
end;
我们再去创建它:
var
aClass: TBaseClass;
aObj: TBaseObj;
begin
aClass := TMyObj;//再换成aClass := TBaseObj试试
aObj := aClass.VCreate;
end;
这个试验的结果说明,利用虚构造函数,我们可以在不知道被创建的对象具体是哪一个类时创建它.
 
OpuBF的观点我不同意.
在VCL中就有一个非常重要的虚构造函数:
TComponent.Create(AOwner:TComponent)
它就被它的子类重写了(我这里用"重写"而不是"重载"是为了区分"override"和"overload").
看一下这行代码:
Application.CreateForm(TForm1, Form1);
是不是很熟悉?它的声明是这样的:
TApplication = class (TCompnent)
...
procedure CreateForm(InstanceClass: TComponentClass
var Reference);
...
end;
我们传给它的类被当作一个TComponentClass,但它仍然能正确地创建Form,这就是虚构造函数的作用.
 
呵呵,没写清楚,被plainsong兄误解了~~

plainsong兄不同意的应该是"如果子类的Constructor与父类恰好相同"这句话吧,我本意是
指在基类的函数未标明为virtual的情况,也就是TObject的Create构造函数的情形。如果基类
声明为虚函数,派生类重载时Delphi是不会有任何异议的 :)
 
gxcooo:
sorry,我上次写错了,现已更正(override代替了原来的重载)
 
大家好,小弟初学delphi,看的是delphi盘上自带的<<OPLG>>,在7-14上写道:
type
TShape = class(TGraphicControl)
private
FPen: TPen;
FBrush: TBrush;
procedure PenChanged(Sender: TObject);
procedure BrushChanged(Sender: TObject);
public
constructor Create(Owner: TComponent)
override;
destructor Destroy
override;
end
如上所示,构造函数Create可以被覆盖(override),析构函数Destroy也可以被Override,
但是TObject类的定义为:
TObject = class
constructor Create;
..
..
destructor Destroy
virtual;
end;
在<<OPLG>>中写道:Methods are by default static.
Virtual and dynamic methods, unlike static methods, can be overridden in
descendant classes.
我理解:Create应为static 函数吧(默认),但为何在其子类中可以被覆盖(override)?
若它是virtual函数,为何在TObject中定义时没有加上virtual?(就这里很不理解)

谢谢gxcooo,jstkof,OpuBF,plainsong 各位的回答,
可能上回我写的有些地方错了(已改正了),但我还是很糊涂,请大家帮忙,谢谢!!!
 
虽然TObject是祖宗,但是万事不能都推到它身上呀 ^_^

你应该查看类的继承树,会发现
TGraphicControl--->...--->TControl
而TControl有一个虚构造函数
constructor Create(AOwner: TComponent)
virtual;
就是它了~~
 
多人接受答案了。
 
后退
顶部