大家都知道,在VCL层次结构的TComponent类中,首次将构造方法Creat声明为virtual的。这样,我们在派生新组件时,总是通过override关键字来覆盖构造方法Creat。据我所掌握的有限的Delphi知识来说,virtual和override关键字是用来实现使父类拥有子类行为的一种机质,既实现多态性,如果将其用在析构方法上,还是很好理解其用意的(父类的析构方法是不能正确释放子类的),但用在构造方法上,我就有些想不通了哦。TComponent将构造方法声明为虚拟的,用意何在,请大家指教。

解决方案 »

  1.   

    --》父类的析构方法是不能正确释放子类的那么父类的构造方法就一定能正确创建子类吗。TComponent构造方法构造了组件的基本特征。而具体的不同应该由子类来决定。考虑这样的方法:
     TCC = class of TC;  TC = class
      public
        constructor Create;
      end;  TC1 = class(TC)
      public
        constructor Create;
      end;
    //然后写测试代码:
    procedure test(CC: TCC);
    var C: TC;
    begin
      C:= CC.Create;
      C.Free;
    end;begin
      test(TC1);
    end;
    此时弹出的对话框显示的是'TC',显示这是由于没有设TC构造方法设为Vritual的源因
    如果将TC的构造方法设为Vritual,而TC1的构造方法设为override;
    再试上面的代码,此时显示的结果是'TC1'TComponent也是同理。这就是多态。
      

  2.   

    对啊,tcomponent有自己的资源要申请,但不是说tcomponent申请的资源,他的字类都够用啊!
    所以他,留个方法,可以让其字类继续申请自己需要使用的资源啊!
      

  3.   

    楼上的说法不对,这不是多态。
    楼上的说法是对应于Inherited的
    如果TComponent的子类在构造函数中没有写Inherited语句,则TComponent构造函数是不会被执行的,则TComponent不会申请到资源。而Inherited也和Virtual没有关系,一个没有虚拟构造函数的类,他的子类在构造方法中调用Inherited,也同样会调用父类的构造方法。请思考我上面说的吧。
      

  4.   

    多谢  linzhengqun 的提点。
    我的概念又清晰了许多
      

  5.   

    继承和多态是两回事,继承是多态的基础,当在子类中有和父类的同名方法,而且需要override父类的同名方法时候才是多态。用句通俗的话讲,叫做有其子必有其父,即将父类的变量指针指向子类的对象的方法。从而实现了父类调用子类的方法。
      

  6.   

    呵呵,不敢太肯定,不过这是Delphi的特点。如果对于普通的虚拟方法就不能这么说了。
     TC = class
      procedure proc;
      end;  TC1 = class(TC)
      procedure proc;
      end;{ TC }procedure TC.proc;
    begin
      ShowMessage('TC');
    end;{ TC1 }procedure TC1.proc;
    begin
      ShowMessage('TC1');
    end;var
      C: TC;
    begin
      C:= TC1.create;
      C.proc;
      C.Free;
    end;
    看看它的效果,再把他弄成虚拟的看看