首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > .NET >

还是关于虚拟方法的有关问题。

2012-02-08 
还是关于虚拟方法的问题。。看到一篇文章说一个对象的VMT表中除了自己定义的虚拟方法外,还有它的祖先的所有

还是关于虚拟方法的问题。。
看到一篇文章说一个对象的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; 

热点排行