静态方法 和 virtual ,Dynamic,override 的理解

参考万一老师: http://www.cnblogs.com/del/archive/2007/12/17/1002959.html

理解如下:

  TBase = class
    procedure proc1; virtual;
    procedure proc2;
  end;

  TChild = class(TBase)
    procedure proc1; override;
    procedure proc2;
  end;

 

procedure TBase.proc1;
 begin ShowMessage('B1');
end;

procedure TBase.proc2;
begin
  ShowMessage('B2');
end;

{ TChild }

procedure TChild.proc1;
begin
  //inherited;
  ShowMessage('C1');
end;

procedure TChild.proc2;
begin
  ShowMessage('C2');
end;

{
 静态方法 : 编译期绑定
 virtual,dynamic 虚方法 运行期绑定,谁创建就绑定到谁的方法上。
}
procedure TForm1.btn7Click(Sender: TObject);
var
  B: TBase;
  C: TChild;
  BC: TBase;
begin
  B := TBase.Create;
  C := TChild.Create;
  BC := TChild.Create;

  B.proc1;          //B1  TBase.proc1
  B.proc2;          //B2  TBase.proc2
  TChild(B).proc1;  //B1  虚方法动态绑定到B 的创建类TBase上 TBase.proc1
  TChild(B).proc2;  //C2  静态方法编译期绑定到 TChild.proc2


  C.proc1;          //C1  绑定到 TChild.proc1
  C.proc2;          //C2  绑定到 TChild.proc2
  TBase(C).proc1;   //C1  虚方法动态绑定到 TChild.TChild
  TBase(C).proc2;   //B2  静态方法编译期绑定到 TBase.proc2


  BC.proc1;         //C1   虚方法动态绑定到 TChild.proc1
  BC.proc2;         //B2   静态方法编译期绑定到 TBase.proc2

  TBase(BC).proc1;  //C1   虚方法绑定到 TChild.proc1
  TBase(BC).proc2;  //B2   静态方法绑定到 TBase.proc2
  TChild(BC).proc1; //C1   绑定到 TChild.proc1
  TChild(BC).proc2; //C2   静态方法绑定到 TChild


  B.Free;
  C.Free;
  BC.Free;

end;

posted on 2010-08-27 15:09  dengdeng  阅读(262)  评论(0编辑  收藏  举报

导航