为什么TObject的Create是静态的,而destroy是virtual?谢谢。
解决方案 »
- 设置自己作的WEBBROWSER为默认浏览器,但不能进行默认浏览
- 老外写了一个程序,把Word文档和SQL语句放在资源文件里,请问有办法打开编辑吗?
- 编写组件是否需要大量的API知识?谢谢。
- 怎么制作安装程序?
- 在用PRINTER 对象打印输出报表时,打印机在打完数据后会往前走纸,如何控制打印机在打完数据后不往前走纸呢?
- 除了低格,我还能做什么??
- delphixe5 连接mysql 编码问题
- WIN98程序升至WIN2000后为啥老是弹出CPU窗口呢?急!
- 问一个巨简单的问题
- fcdbtreeview谁用过,有时间会出现重复显示现象怎么解决?
- 谁有用DELPHI做的编译器,给一个人我,100分全是他的.
- 欢迎加入中国Delphi大联盟QQ群-(做最好的讨论,求助,资源共享 QQ群 号码:1463857)
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TA = class
public
constructor Create;
destructor Destroy;
end; TB = class
public
constructor Create;
destructor Destroy; override;
end; TForm1 = class(TForm)
Button1: TButton;
Button2: TButton;
Button3: TButton;
Button4: TButton;
procedure Button1Click(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button3Click(Sender: TObject);
procedure Button4Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;implementation{$R *.dfm}
{ TA }constructor TA.Create;
begin
inherited;
ShowMessage('A creating');
end;destructor TA.Destroy;
begin
ShowMessage('A destroying');
inherited;
end;{ TB }constructor TB.Create;
begin
inherited;
ShowMessage('B creating');
end;destructor TB.Destroy;
begin
ShowMessage('B destroying');
inherited;
end;
procedure TForm1.Button1Click(Sender: TObject);
var
T1: TA;
begin
T1 := TA.Create;
T1.Destroy; //我们用Destroy而不用Free, 这样看起来比较直观, 以下相同
end;procedure TForm1.Button2Click(Sender: TObject);
var
T2: TB;
begin
T2 := TB.Create;
T2.Destroy;
end;procedure TForm1.Button3Click(Sender: TObject);
var
T3: TObject;
begin
T3 := TA.Create;
T3.Destroy; //这里要看清楚了, 如果destroy不override, 会有什么后果!
end;procedure TForm1.Button4Click(Sender: TObject);
var
T4: TObject;
begin
T4 := TB.Create;
T4.Destroy;
end;end.
显然的。
如有某些指针、对象(Delphi中即对象引用),最终的释放如何进行都需要程序员来决定,没有统一的方式。Create是静态的
因为Create是由类来调用的,形式为anObject := TObject.Create.(暂不考虑将anObject.Create的情况),此时通过TObject可以确定该类的实例的大小,因为该数据是编译时就确定的,并以RTTI的形式,可以在程序中获取的。在Create中分配该大小的内存,之后进行清理(即初始化为零:数值型为0,字符串为空)。这些工作是编译器产生的。。完成这些工作后,在调用各个具体的子类中的Create中的具体的语句。至于
a: TStrings;
...
a := TStringList.Create;的情况,则是因为运行时,根据RTTI决定具体的类的Create。至于anObject.Create的情况,则将其看成普通的静态函数调用。它与TObject.Create的区分由编译器自动进行。
为什么TObject的Create是静态的:
当你要创建一个对象的时候,该对象还不存在。Create是静态的,保证了该方法可直接调用。
而destroy是virtual:
这样可以让程序员自己来编写各种派生类的析构过程,并方便地调用父类的析构过程。如果不是虚拟的,如何完成这种扩充性和传递性?
http://expert.csdn.net/Expert/topic/2429/2429126.xml?temp=.8375971