纠正一个概念:类就有VMT,各实例不过是共享这个VMT而已

不是只有实例才有VMT,举个例子,各实例的VMT地址是相同的:

Use System.Contnrs;

procedure TForm1.BitBtn2Click(Sender: TObject);
var
  ObjList1, ObjList2: TList;
  p1, p2: Pointer;
begin
  ObjList1 := TObjectList.Create(True);
  ObjList2 := TObjectList.Create(True);
  if ObjList1 = ObjList2 then
    ShowMessage('ObjList1 = ObjList2'); // 不执行

  p1:= PPointer(ObjList1)^;
  p2:= PPointer(ObjList2)^;
  if Integer(p1) = Integer(p2) then
    ShowMessage('ObjList1.VMT = ObjList2.VMT'); // 执行
end;

再和类的VMT比较:

procedure TForm1.BitBtn3Click(Sender: TObject);
var
  ObjList1, ObjList2: TList;
  p1, p2: Pointer;
begin
  ObjList1 := TObjectList.Create(True);
  ObjList2 := TObjectList.Create(True);
  if ObjList1 = ObjList2 then
    ShowMessage('ObjList1 = ObjList2'); // 不执行

  p1:= Pointer(TObjectList);
  p2:= PPointer(ObjList2)^;
  if Integer(p1) = Integer(p2) then
    ShowMessage('TObjectList.VMT = ObjList2.VMT'); // 相等,执行
end;

这也相当于说,类的第一项元素就是VMT,而VMT的第一项内容是一个地址,它是指向一个函数的指针。

------------------------------------------------------------------------------------------------------------

http://blog.csdn.net/linzhengqun/article/details/1755493

posted @ 2016-03-21 19:19  findumars  Views(315)  Comments(0Edit  收藏  举报