理解 C++ 物件在記憶體中的佈局,對於效能調優、除錯與跨語言互操作至關重要。本文系統性分析單一繼承、多重繼承、虛擬繼承、菱形繼承等情況下的物件記憶體結構與虛函數表(vtable)組織。
__vfptr)。子類別 vtable 先存放父類別虛函數,再存放自身新增虛函數。若覆寫父類別虛函數,對應 vtable 條目會被取代為子類別函式位址。
子類別依宣告順序依序包含各父類別子物件(各自帶 vptr),最後放置自身成員。子類別新增虛函數存放於第一個父類別 vtable 尾端。覆寫特定父類別虛函數時,修改對應父類別 vtable 條目。
虛擬繼承下,子類別擁有獨立 vtable,並另行保存一份父類別 vtable,中間以 4 位元組 0x00000000 分隔。佈局順序:子類別 vtable → 子類別資料 → 0x0 分隔 → 父類別 vtable → 父類別資料。若子類別無虛函數,則無 vtable,但仍需 0x0 分隔。
虛擬基類別在記憶體中僅存在一份,所有繼承路徑共享該實體,解決菱形繼承的資料重複問題。