在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
因为看Delphi书的时候,就产生了疑惑。老讲调用父类虚函数,但是万一需要调用祖父虚函数怎么办?
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;
感谢 [长春]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”
|
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论