您的位置:首页 > 编程语言 > Delphi

Delphi子类调用祖父类的虚函数

2016-12-07 22:32 288 查看
因为看Delphi书的时候,就产生了疑惑。老讲调用父类虚函数,但是万一需要调用祖父虚函数怎么办?
后来又经常在C++里看到,就更疑惑了

type
TA = class
procedure ShowMsg; virtual;
end;

TAClass = class of TA;

TB = class(TA)
procedure ShowMsg; override;
end;

TShowMsg = procedure of object;

TC = class(TB)
private
FGrandFatherShowMsg: TShowMsg;
procedure ShowMsg; override;
public
constructor Create;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
C: TC;
begin
C := TC.Create;
C.ShowMsg;
C.Free;
end;

{ TC }

constructor TC.Create;
var
AMethod:TShowMsg;
ACode: TMethod absolute AMethod;
A: TA;
begin
inherited Create;
A := TA.Create;
FGrandFatherShowMsg := A.ShowMsg;
AMethod:= FGrandFatherShowMsg;
ACode.Data := Self;
A.Free;
end;

procedure TC.ShowMsg;
begin
FGrandFatherShowMsg;
ShowMessage('TC');
end;

{ TA }

procedure TA.ShowMsg;
begin
ShowMessage('TA');
end;

{ TB }

procedure TB.ShowMsg;
begin
inherited;
ShowMessage('TB');
end;


利用了 Delphi 能够创建纯虚函数实例的特性
记录下了TA的函数地址
然后替换其Data的值为Self,然后在需要的时候再调用
利用了两点:TMethod和Delphi能够创建纯虚类实例
只是说万一纯虚的话,这个也好使

感谢 [长春]swish

----------------------------------------------------------

另一种办法:

type
TBase = class
procedure Foo; virtual;
end;

TAnsestor = class(TBase)
procedure Foo; override;
end;

TChild = class(TAnsestor)
procedure Foo; override;
procedure BaseFoo;
end;

procedure TBase.Foo;
begin
ShowMessage('TBase');
end;

procedure TAnsestor.Foo;
begin
ShowMessage('TAnsestor');
end;

procedure TChild.Foo;
begin
ShowMessage('TChild');
end;

type
TFoo = procedure of object;

procedure TChild.BaseFoo;
var
Proc: TFoo;

begin
TMethod(Proc).Code := @TBase.Foo; // Static address
TMethod(Proc).Data := Self;
Proc();
end;

procedure TForm4.Button1Click(Sender: TObject);
var
Obj: TChild;
Proc: TFoo;

begin
Obj:= TChild.Create;
Obj.BaseFoo;
// or else
TMethod(Proc).Code := @TBase.Foo; // Static address
TMethod(Proc).Data := Obj;
Proc();

Obj.Free;
end;

http://stackoverflow.com/questions/4662744/delphi-how-to-call-inherited-inherited-ancestor-on-a-virtual-method
诀窍是搜索关键字“delphi inherited super parent”
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: