还是关于虚拟方法的问题。。
看到一篇文章说一个对象的VMT表中除了自己定义的虚拟方法外,还有它的祖先的所有的虚拟方法。但是今天跟进去看了看VMT发现只有它自己的虚拟方法,这是什么原因,难道又是编译器决定在某些时候不在VMT中写入祖先的虚拟方法?
[解决办法]
先构造一这样段代码:
- Delphi(Pascal) code
type TBase = class public procedure FooVirtual1; virtual; procedure FooVirtual2; virtual; procedure FooDynamic1; dynamic; procedure FooDynamic2; dynamic; procedure GetAddrs(var V1, V2, D1, D2: Pointer); end; TFoo = class(TBase) procedure FooVirtual1; override; procedure FooDynamic1; override; end;procedure TForm1.Button1Click(Sender: TObject);var v1, v2, d1, d2: Pointer;begin Memo1.Clear; with TBase.Create do begin GetAddrs(v1, v2, d1, d2); Memo1.Lines.Add(Format('[%p] %s', [Pointer(ClassType), ClassName])); Memo1.Lines.Add(Format(#9'v1: %p'#9'v2: %p'#9'd1: %p'#9'd2: %p', [v1, v2, d1, d2])); Free; end; with TFoo.Create do begin GetAddrs(v1, v2, d1, d2); Memo1.Lines.Add(Format('[%p] %s', [Pointer(ClassType), ClassName])); Memo1.Lines.Add(Format(#9'v1: %p'#9'v2: %p'#9'd1: %p'#9'd2: %p', [v1, v2, d1, d2])); Free; end;end;{ TBase }procedure TBase.FooDynamic1;beginend;procedure TBase.FooDynamic2;beginend;procedure TBase.FooVirtual1;beginend;procedure TBase.FooVirtual2;beginend;procedure TBase.GetAddrs(var V1, V2, D1, D2: Pointer);type Tfoo = procedure of object;var method : TMethod; foo : TFoo absolute method;begin foo := FooVirtual1; V1 := method.Code; foo := FooVirtual2; V2 := method.Code; foo := FooDynamic1; D1 := method.Code; foo := FooDynamic2; D2 := method.Code;end;{ TFoo }procedure TFoo.FooDynamic1;beginend;procedure TFoo.FooVirtual1;beginend;