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

深度探索 C++ 物件模型 (6):虛擬繼承、資料成員配置與指向成員指標

     編輯:關於C++

虛擬繼承下的類別大小

class X {};
class Y : public virtual X {};
class Z : public virtual X {};
class A : public Y, public Z {};

// sizeof 結果 (視編譯器而異)
sizeof(X); // 1 (空類別插入 1 byte char 確保唯一位址)
sizeof(Y); // 8 (傳統編譯器: vptr 4 + char 1 + padding 3)
sizeof(Z); // 8
sizeof(A); // 12 (vptr 4 + vptr 4 + char 1 + padding 3)
/* 新式編譯器優化:空虛擬基類視為衍生類開頭,Y/Z 大小可能為 4,A 為 8 */

空類別大小非 0:編譯器插入 1 byte 確保物件唯一位址。虛擬繼承引入 vptr 指向虛擬基類子物件,配合對齊 (Alignment) 產生填補位元組。

資料成員繫結:防禦性宣告風格

嵌套型別宣告應置於類別開頭,確保非直覺繫結正確:

typedef int length;
class Point3D {
public:
    void mumble(length val) { _val = val; } // length 繫結為 global typedef int
    length mumble() { return _val; }
private:
    typedef float length; // 此處宣告過晚,導致上方參考非法
    length _val;
};

資料成員配置與存取

  • 靜態資料成員:視為全域變數,類別生命週期內單一實體,存取零額外負擔,名稱衝突由編譯器演算法解決。
  • 非靜態資料成員:透過 this 指標 + 位移量存取。編譯器轉換:x += pt.x → this->x += pt.x。

指向資料成員的指標

&Point3D::z 值非單純位移。若類別有虛擬函式,vptr 可能在物件開頭或結尾,位移為 8 或 12。實際值再 +1:

  • 區分「指向第一個成員」與「不指向任何成員」(空指標) 的指標。
  • 類比:三房一廳三人合住。給共同朋友地址只需門牌 (不指向成員);給私人朋友需門牌+房號 (指向成員)。大廳作為位移量 (offset) 區分兩者。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved