为什么TObject的Create是静态的,而destroy是virtual?谢谢。

解决方案 »

  1.   

    理论都是苍白的,   我又写了一个例子大家看看就懂了unit Unit1;interfaceuses
      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.
      

  2.   

    destroy是virtual
    显然的。
    如有某些指针、对象(Delphi中即对象引用),最终的释放如何进行都需要程序员来决定,没有统一的方式。Create是静态的
    因为Create是由类来调用的,形式为anObject := TObject.Create.(暂不考虑将anObject.Create的情况),此时通过TObject可以确定该类的实例的大小,因为该数据是编译时就确定的,并以RTTI的形式,可以在程序中获取的。在Create中分配该大小的内存,之后进行清理(即初始化为零:数值型为0,字符串为空)。这些工作是编译器产生的。。完成这些工作后,在调用各个具体的子类中的Create中的具体的语句。至于
    a: TStrings;
    ...
    a := TStringList.Create;的情况,则是因为运行时,根据RTTI决定具体的类的Create。至于anObject.Create的情况,则将其看成普通的静态函数调用。它与TObject.Create的区分由编译器自动进行。
      

  3.   

    简单地回答。
    为什么TObject的Create是静态的:
    当你要创建一个对象的时候,该对象还不存在。Create是静态的,保证了该方法可直接调用。
    而destroy是virtual:
    这样可以让程序员自己来编写各种派生类的析构过程,并方便地调用父类的析构过程。如果不是虚拟的,如何完成这种扩充性和传递性?
      

  4.   

    对于 Create为什么是静态的
    http://expert.csdn.net/Expert/topic/2429/2429126.xml?temp=.8375971