在CREATE一个对象的时候,你有什么派生类的CREATE吗,可能是派生类的CREATE吗?
例如:
  TParentObject = class(TObject)
  public
    constructor Create; virtual;
  end;  TChildObject = class(TParentObject)
  public
    constructor Create; override;
  end;那么TParentObject.Create难道会返回一个TChildObject的实例吗?
呵呵,这是不可能的事情呀继续讨论
(不过结果我已经基本上出来喽)

解决方案 »

  1.   

    Virtual是面向对象的理论,如果一个过程用了virtual
    那么
    type
      a = class
      public  
        procedure act; virtual;
      end;  b = class(a)
      public
        procedure act; override;
      end;那么我调用  
    var
      b1 : b;
    begin
      b1.act
      //这里会先去调用类b的act方法,然后去调用类a的act方法。
    end;
    以上代码仅参考,不能运行。
      

  2.   

    面向对象的理论我当然知道,一般的VIRTUAL我也知道。
    不过这里说的是CONTRUCTOR的VIRTUAL,呵呵
      

  3.   

    to: tjf1117(tjf1117) 
    你说调用b1.act会调用到a的act方法吗?如果在b1.act中没有inherited;a的act好象是不会调用的吧??这一点可是要注意
      

  4.   

    而且,virtual不应该使用这一个例子来说明哦,应该用下面这个:b1: a;
    begin
      b1 := b.create;
      b1.act;
    end;
      

  5.   

    那么TParentObject.Create难道会返回一个TChildObject的实例吗?
    对于这个问题,是有可能的,
    因为多数的Create都是用Constructor限制的,所以,是不允许abstract的,
    但是如果Create不用constructor限制,有可能实现的。(懒的去编程证明,)因为实际工作中很少用到。这就是面向对象的强大之处了。如果使用abstract可以用把多个子类的对象 都 看作一个父类的对象,去调用各个子类的方法。
      

  6.   

    呵呵,我指的是在OP中的CREATE,其实是想知道TCOMPONENT中的CREATE做成VIRTUAL的有什么用?
      

  7.   

      TObjClass = class of TParentObject;
      TParentObject = class(TObject)
      public
        constructor Create; virtual;
      end;  TChildObject = class(TParentObject)
      public
        constructor Create; override;
      end;implementation{ TParentObject }constructor TParentObject.Create;
    begin
      ShowMessage('Parent Create');
    end;{ TChildObject }constructor TChildObject.Create;
    begin
      ShowMessage('Child Create');
    end;
    procedure TForm1.Button1Click(Sender: TObject);
    var
      a: TObjClass;
    begin
      a := TChildObject;
      a.Create;
    end;看看a.Create会出现哪一个ShowMessage ?
      

  8.   

    Object Pascal中有类引用变量之说,就是可以将一个类定义赋给一个变量,拿TComponent.Create作例子:var
      Classes: array [1..2] of TComponentClass;
      e, l: TComponent;
    begin
      Classes[1] := TEdit;
      Classes[2] := TLabel;  e := Classes[1].Create(nil);  // 虽然Classes[1]是一个TComponentClass,但其实e是一个TEdit的实例
      l := Classes[2].Create(nil); // 虽然Classes[1]是一个TComponentClass,但其实e是一个TLabel的实例这样的构造方法可以创建出各种各样的对象。这也是Delphi窗体编辑器的基础。另外,非构造方法的class方法,其实也有用。假设TControl有一个virtual的class方法foo,TEdit和TLabel都有一个相应的override的方法foo,那么e.foo调用的应该是TEdit.foo而l.foo调用的是TLabel.foo,跟对象方法一样。不知对否?请批评。
      

  9.   

    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
      StdCtrls;type
      TForm1 = class(TForm)
        Button1: TButton;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;  TParent = class
      public
        constructor Create; virtual;
        procedure Show; virtual; abstract;
      end;  TChild = class(TParent)
      public
        constructor Create; override;
        procedure Show; override;
      end;
    var
      Form1: TForm1;implementation{$R *.DFM}constructor TParent.Create;
    begin
    end;constructor TChild.Create;
    begin
      inherited;
    end;
    procedure TChild.Show;
    begin
      Showmessage('Child');
      inherited;
    end;procedure TForm1.Button1Click(Sender: TObject);
    var
      P : TParent;
    begin
      P := TChild.Create;
      //注意这里p是一个parent,但是。
      P.Show;
    end;end.
    这是我的看法,刚才你可能没有明白我的意思,
    可能有一个异常,我没有仔细编,这是一种应用方式,
    比如很多人编代码,他只要有一个很简单的父类,有一个abstract的方法,我就可以调用你编写的子类产生的对象的方法,不管你在原有的类上又派生了多少层。也不会有问题,
      

  10.   

    我想,是你没有理解我的意思吧.
    我指的不是虚态方法的定义以及使用.
    在你的那一段程序中,不管是不是有那一个虚态的CREATE方法都不会对你的
    程序的结果产生任何问题,CREATE方法虚不虚态的意义就像agui(阿贵)说的那样
    是对于一个类类型的声明以及使用,而不是普通的类的虚态方法的调用。你说C++可以做到,我想请教一下喽(阿贵那样的做法,C++如何做到?)
      

  11.   

    我也没有别的意思,就跟你说的差不多,
    所以我们的代码也基本相同,我只是说说abstract的用法,你会看到delphi的源码里面有很多这种方法的。
    阿贵的那段代码跟我们的没有太多共同之处,道理相同,
    他把TEdit赋值给TComponetClass.
    我把Child赋值给Parent.
    他分别调用了各自的create方法。
    我也是,但是有点不同,从用法不同,
    比如我编写一个unit,你编写一个unit,
    你从你的unit传过来一个child对象,
    我只需要在自己的unit里面声明parent类和abstract方法,就可以不必再考虑其他问题了。他的代码是把类的操作有点对象化了,是挺有意思的,实际也是这样,delphi里面最特殊的类就是TObject了。