delphi - 如何检测 Delphi 类是否具有虚拟构造函数?

标签 delphi delphi-2009 rtti

例如,有没有办法发现这个类有一个虚拟构造函数(在运行时)?

   TMyClass = class(TObject)
     MyStrings: TStrings;
     constructor Create; virtual;   
   end;

例如,在这段代码中,我想测试 Clazz 引用的类是否具有虚构造函数:

procedure Test;
var
  Clazz: TClass;
  Instance: TObject;
begin
  Clazz := TMyClass;
  Instance := Clazz.Create;
end;

是否有一个简单的解决方案,例如使用 RTTI,它在 Delphi 6 到 2009 中有效?

最佳答案

查看 TypInfo 单元,似乎没有任何方法可以使用 RTTI 来判断一个方法是否是虚拟的。但是,如果您有类引用,您可能可以通过检查 VMT 来推出自己的方法。

根据 Allen Bauer 的说法,在对 this question 的回答中,您可以在 vmtClassName 指向的值之前找到 VMT 的结尾。第一个用户定义的虚拟方法(如果有的话)是在类引用的地址找到的。换句话说,pointer(Clazz)^。现在您知道了 VMT 的用户定义部分的起点和终点,制作一个 while 循环来比较表中的每个指针与指向 Clazz.create 的方法指针的代码部分应该不会太困难转换为 TMethod。如果你得到一个匹配,那么它就是一个虚方法。如果不是,那就不是。

是的,这有点麻烦,但它会起作用。如果有人能找到更好的解决方案,他们将获得更多权力。

关于delphi - 如何检测 Delphi 类是否具有虚拟构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/791004/

相关文章:

Delphi - 在主窗体创建上停止应用程序

.net - 如何注册 .net exe 公开的 com 接口(interface)?

delphi - 在Delphi中,我可以从同名的类方法调用实例方法吗?

delphi - 如何在Delphi 2009中从rc文件构建资源库?

delphi - Delphi 2010 RTTI和Pointer字段

c++ - 尝试计算派生类的实例,type_id 不起作用

delphi - Delphi 属性真实世界示例在哪里?

delphi - 泛型:什么是 "CONSTRUCTOR constraint"?

delphi - 透明位图作为资源?

delphi - 如何使用 TypInfo RTTI 方法为子属性项设置值?