不是只有实例才有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

05-08 08:42