回覆列表
  • 1 # 天翼使用者910720676494

    在以介面的方式呼叫成員函式的時候,比如 MyIntfA.ProcA,這時編譯器不知道 MyIntfA 到底指向哪種型別(class)的物件,無法知道 MyIntfA 與 Self 之間的距離(實際上,在上面的例子中 Delphi 編譯器知道 MyIntfA 與 Self 之間的距離,只是為了與 COM 的二進位制格式相容,使其它語言也能夠使用介面指標呼叫介面成員函式,必須使用後期的 Self 指標修正),編譯器直接把 MyIntfA 指向的地址設定為 Self。從上圖可以看到,MyIntfA 指向 MyObject 物件空間中 $18 偏移地址。這時的 Self 指標當然是錯誤的,編譯器不能直接呼叫 TMyObject.ProcA,而是呼叫 IIntfA 的“介面跳轉表”中的 ProcA。“介面跳轉表”中的 ProcA 的內容就是對 Self 指標進行修正(Self - $18),然後再呼叫 TMyObject.ProcA,這時就是正確呼叫物件的成員函數了。由於每個類實現介面的順序不一定相同,因此對於相同的介面在不同的類中實現,就有不同的介面跳轉表(當然,可能編輯器能夠聰明地檢查到一些類的“介面跳轉表”偏移量相同,也可以共享使用)。

  • 中秋節和大豐收的關聯?
  • 日月入詩的詩句?