首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ 類別物件記憶體模型深度解析:繼承、虛函數與菱形繼承

     編輯:關於C++

理解 C++ 物件在記憶體中的佈局,對於效能調優、除錯與跨語言互操作至關重要。本文系統性分析單一繼承、多重繼承、虛擬繼承、菱形繼承等情況下的物件記憶體結構與虛函數表(vtable)組織。

基礎規則

  • 含虛函數的類別,物件開頭為虛函數表指標(__vfptr)。
  • 繼承鏈中,子類別物件前段包含父類別完整拷貝(含 vptr)。
  • 無論繼承多少層,物件僅有一個 vptr(單一繼承情況)。

虛函數表組織

子類別 vtable 先存放父類別虛函數,再存放自身新增虛函數。若覆寫父類別虛函數,對應 vtable 條目會被取代為子類別函式位址。

多重繼承佈局

子類別依宣告順序依序包含各父類別子物件(各自帶 vptr),最後放置自身成員。子類別新增虛函數存放於第一個父類別 vtable 尾端。覆寫特定父類別虛函數時,修改對應父類別 vtable 條目。

虛擬繼承差異

虛擬繼承下,子類別擁有獨立 vtable,並另行保存一份父類別 vtable,中間以 4 位元組 0x00000000 分隔。佈局順序:子類別 vtable → 子類別資料 → 0x0 分隔 → 父類別 vtable → 父類別資料。若子類別無虛函數,則無 vtable,但仍需 0x0 分隔。

菱形虛擬繼承

虛擬基類別在記憶體中僅存在一份,所有繼承路徑共享該實體,解決菱形繼承的資料重複問題。

總結

  1. 基類別:有虛函數則 vptr 在前,接著資料成員;無虛函數直接放資料。
  2. 單一繼承:父類別拷貝在前,子類別資料在後。
  3. vtable 順序:父類別虛函數 → 子類別虛函數。
  4. 覆寫會取代 vtable 對應條目。
  5. 多重繼承:依宣告順序排列父類別子物件,子類別虛函數置於第一父類別 vtable 末端。
  6. 虛函數呼叫:編譯器查詢物件 vtable 取得函式位址並透過 this 指標呼叫。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved