如何在Delphi编程中从子类获取指向基类中某个特定方法的指针?

2026-04-10 19:512阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计269个文字,预计阅读时间需要2分钟。

如何在Delphi编程中从子类获取指向基类中某个特定方法的指针?

以下是简化后的伪代码内容:

这是我的代码示例:type TMyBaseClass=class procedure SomeProc; virtual; end;

TMyChildClass=class(TMyBaseClass) procedure SomeProc; override; end;

var SomeDelegate: procedure of object;

这是我的代码示例:

type TMyBaseClass = class public procedure SomeProc; virtual; end; TMyChildClass = class(TMyBaseClass) public procedure SomeProc; override; end; var SomeDelegate: procedure of object; procedure TMyBaseClass.SomeProc; begin ShowMessage('Base proc'); end; procedure TMyChildClass.SomeProc; begin ShowMessage('Child proc'); // here i want to get a pointer to TMyBaseClass.SomeProc (NOT IN THIS CLASS!): SomeDelegate := SomeProc; end; procedure TForm1.Button1Click(Sender: TObject); begin with TMyChildClass.Create do try // there will be "Child proc" message: SomeProc; finally Free; end; // there i want to get "Base proc" message, but i get "Child proc" again // (but it is destroyed anyway, how coud it be?): SomeDelegate; end; 我知道的一种方式是:

procedure TMyChildClass.BaseSomeProc; begin inherited SomeProc; end; procedure TMyChildClass.SomeProc; begin ShowMessage('Child proc'); SomeDelegate := BaseSomeProc; end;

第二个是将SomeProc声明从覆盖更改为重新引入:

TMyChildClass = class(TMyBaseClass) public procedure SomeProc; reintroduce; end;

然后将self转换为TMyBaseClass(不要使用as cast):

如何在Delphi编程中从子类获取指向基类中某个特定方法的指针?

SomeDelegate := TMyBaseClass(self).SomeProc;

另请注意,您的代码将提供访问冲突,因为您在已释放的对象上调用SomeDelegate.

本文共计269个文字,预计阅读时间需要2分钟。

如何在Delphi编程中从子类获取指向基类中某个特定方法的指针?

以下是简化后的伪代码内容:

这是我的代码示例:type TMyBaseClass=class procedure SomeProc; virtual; end;

TMyChildClass=class(TMyBaseClass) procedure SomeProc; override; end;

var SomeDelegate: procedure of object;

这是我的代码示例:

type TMyBaseClass = class public procedure SomeProc; virtual; end; TMyChildClass = class(TMyBaseClass) public procedure SomeProc; override; end; var SomeDelegate: procedure of object; procedure TMyBaseClass.SomeProc; begin ShowMessage('Base proc'); end; procedure TMyChildClass.SomeProc; begin ShowMessage('Child proc'); // here i want to get a pointer to TMyBaseClass.SomeProc (NOT IN THIS CLASS!): SomeDelegate := SomeProc; end; procedure TForm1.Button1Click(Sender: TObject); begin with TMyChildClass.Create do try // there will be "Child proc" message: SomeProc; finally Free; end; // there i want to get "Base proc" message, but i get "Child proc" again // (but it is destroyed anyway, how coud it be?): SomeDelegate; end; 我知道的一种方式是:

procedure TMyChildClass.BaseSomeProc; begin inherited SomeProc; end; procedure TMyChildClass.SomeProc; begin ShowMessage('Child proc'); SomeDelegate := BaseSomeProc; end;

第二个是将SomeProc声明从覆盖更改为重新引入:

TMyChildClass = class(TMyBaseClass) public procedure SomeProc; reintroduce; end;

然后将self转换为TMyBaseClass(不要使用as cast):

如何在Delphi编程中从子类获取指向基类中某个特定方法的指针?

SomeDelegate := TMyBaseClass(self).SomeProc;

另请注意,您的代码将提供访问冲突,因为您在已释放的对象上调用SomeDelegate.