例如,有没有办法发现这个类有一个虚拟构造函数(在运行时)?
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/