首页 > 代码库 > Delphi子类调用祖父类的虚函数
Delphi子类调用祖父类的虚函数
因为看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”
Delphi子类调用祖父类的虚函数
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。