大家都知道,在VCL层次结构的TComponent类中,首次将构造方法Creat声明为virtual的。这样,我们在派生新组件时,总是通过override关键字来覆盖构造方法Creat。据我所掌握的有限的Delphi知识来说,virtual和override关键字是用来实现使父类拥有子类行为的一种机质,既实现多态性,如果将其用在析构方法上,还是很好理解其用意的(父类的析构方法是不能正确释放子类的),但用在构造方法上,我就有些想不通了哦。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也是同理。这就是多态。
所以他,留个方法,可以让其字类继续申请自己需要使用的资源啊!
楼上的说法是对应于Inherited的
如果TComponent的子类在构造函数中没有写Inherited语句,则TComponent构造函数是不会被执行的,则TComponent不会申请到资源。而Inherited也和Virtual没有关系,一个没有虚拟构造函数的类,他的子类在构造方法中调用Inherited,也同样会调用父类的构造方法。请思考我上面说的吧。
我的概念又清晰了许多
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;
看看它的效果,再把他弄成虚拟的看看