虚函数的特点就是执行的时候会下降到子类去执行同名覆盖函数 good

var
t: TBitBtn;
begin
t:=TBitBtn.Create(nil);
t.Name:='BitBtn100';
t.parent :=Self; // 这里下断点
end;

一路跟踪就会发现以下函数执行的时候下降(执行子类覆盖函数):

TBitBtn.CreateHandle;
TButton.CreateWnd;
TBitBtn.CreateParams

但是子类也不会放弃父类已经提供的功能,全都是在父类函数执行前或者执行后的结果上增加一小部分特性,形成三明治风格。

干脆,我们看看TBitBtn增加些什么东西:

procedure TBitBtn.CreateHandle;
var
State: TButtonState;
begin
if Enabled then // 增加按钮的状态
State := bsUp
else
State := bsDisabled;
inherited CreateHandle;
TButtonGlyph(FGlyph).CreateButtonGlyph(State); // 增加按钮的图像
end;

procedure TButton.CreateWnd;
begin
inherited CreateWnd;
FActive := FDefault; // 增加判断是否处于激活状态
end;

procedure TBitBtn.CreateParams(var Params: TCreateParams);
begin
inherited CreateParams(Params);
with Params do Style := Style or BS_OWNERDRAW; // 增加自绘状态
end;

你可能感兴趣的:(虚函数)