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