用了这么久delphi,到现在仍然对构造函数不是很清楚
1、constructor Create(AOwner: TComponent); override;
constructor Create(AOwner: TComponent); 
上面两个的区别?
构造函数跟一般函数的继承重载上有些什么区别,
希望大家讨论下,总结下。

解决方案 »

  1.   

    这两句的区别,属于面向对象的基本知识。另外,构造函数也可以理解成是一个普通的函数,但是特殊在如果对象的内存还没分配的时候,它会自动调用NewInstance来获取内存。
      

  2.   

    最大的区别是:
    constructor Create(AOwner: TComponent); override; //可以继承祖先的构造方法,也可以让子类继承
    constructor Create(AOwner: TComponent); //不能让子类继承。如果在实现部分加入:inherited Create(AOwner);可以继承祖先的构造方法。
      

  3.   

    没看懂楼上的意思
    override用于把子类的函数覆盖掉父类的同名函数(前提是父类函数声明为virtual).当你用父类的容器去装一个子类的实体时才会体现出它的作用:如果子类该函数没有override的话,执行的将是父类的函数;反之则执行子类的函数.
    不过老实说我确实没太搞懂delphi为什么需要把构造函数申明成虚函数. TComponent的构造函数就是虚函数,子类,比如Tcontral都是override了父类的create(不过在override时候inherited了父类的构造函数).如果是成员函数,我明白虚函数的用处,但对于构造函数,delphi里一般都是这样使用: a:=Ta.create; 那子类是否override似乎并没什么区别.除非是直接使用a.create 这样的方式调用才行.
      

  4.   

    delphi根类TObject的构造不是虚的,而TComponent是虚的,为了子类能够继承。
      

  5.   

    那问问override,在父类下的函数是private,
    子类下可不可以为public
      

  6.   

    谢谢楼主的提醒,以前只是想到虚方法以及override的用法,真的没考虑过构造函数为什么要弄成虚方法,网上查找了一下,发现这篇文章,不过也没看太懂,希望对各位有帮助
    http://dev.csdn.net/htmls/77/77003.html
      

  7.   

    http://www.qqkjl.com/delphi2012/20100307/2448.html
      

  8.   

    http://www.qqkjl.com/delphi2012/20100307/2448.html
    通过这篇文章终于找到点儿区别,引用一下,写一个小例子,供大家参考Taaa = class
      public
        constructor Create(a: String);virtual;
      end;  Tbbb = class(Taaa)
      public
        constructor Create(a: string);
      end;  Tccc = class(Taaa)
      public
        constructor Create(a: string);override;
      end;  Taaaclass = class of Taaa;{ Taaa }constructor Taaa.Create(a: String);
    begin
      ShowMessage('Taaa');
    end;{ Tccc }constructor Tccc.Create(a: string);
    begin
      inherited;
      ShowMessage('Tccc');
    end;{ Tbbb }constructor Tbbb.Create(a: string);
    begin
      inherited;
      ShowMessage('Tbbb');
    end;用法一:这样似乎没有什么区别,都能正确的构造对象。
    procedure TForm1.btn1Click(Sender: TObject);
    var
      a: Taaa;
    begin
      a := Taaa.Create('');
      a := Tbbb.Create('');
      a := Tccc.Create('');
    end;用法二:如果这样用的话,虚方法就起到作用了
    procedure TForm1.btn2Click(Sender: TObject);
    var
      a,b,c: Taaaclass;
    begin
      a := Taaa;
      b := Tbbb;
      c := Tccc;  b.Create(''); //调用的是Taaa的构造函数,Tbbb中没有覆盖父类的构造方法
      c.Create(''); //调用的是Tccc的构造函数,Tccc中覆盖了父类的构造方法end;不知道说清楚了没有,呵呵
      

  9.   

    constructor Create(AOwner: TComponent); override;
    可以看其实现的代码中会自动加了 inherited 这说明可以用其所有上级的Create
    constructor Create(AOwner: TComponent); 
    这个代码中是不会自动加的,所以不能用其上级的哦。。其实constructor Create 方法是默认虚拟的方法。
    是通过类来调用的类方法,与其他对象方法不一样。所以其可以创建对象、、
      

  10.   

    OOP是一个需要不断理解的东西
      

  11.   


    procedure TApplication.CreateForm(InstanceClass: TComponentClass; var Reference);
    var
      Instance: TComponent;
    begin
      Instance := TComponent(InstanceClass.NewInstance);
      TComponent(Reference) := Instance;
      try
        Instance.Create(Self);         
      except
        TComponent(Reference) := nil;
        raise;
      end;
      if (FMainForm = nil) and (Instance is TForm) then
      begin
        TForm(Instance).HandleNeeded;
        FMainForm := TForm(Instance);
      end;
    end;
    看这一句    Instance.Create(Self);     自己思考一下,假如TCustomForm的Create没有override的话,使用
    Application.CreateForm(TForm1, Form1); 还能否正常?
      

  12.   

    讨论了几百年的烂问题,去把virtual这个关键字搞懂就明白了~