C 物件模型(一)

2021-06-03 13:34:58 字數 1588 閱讀 2822

在c++中,有兩種類成員變數:static 和 nonstatic ;三種類成員函式: static 、nonstatic 和 virtual ;

如:

class point

;

簡單物件模型:

圖1:簡單物件模型

在這個模型中,乙個object是一些列的slots,每乙個slot指向乙個成員,成員按其宣告次序,各被指定乙個slot;

成員並不放在object中,只有指向成員的指標才放在object中,這樣可以避免不同型別的成員需要不同的儲存空間;

乙個object大小計算:指標大小,乘以class中所宣告的成員數目。

**驅動物件模型:

圖2  成員表物件模型

c++物件模型:

圖3 c++物件模型

優點:空間和訪問時間的效率;

缺點:修改非靜態成員時,程式**需重新編譯;

物件的差異:

library_materials thing1;

book book;

//book被切割了

thing1=book;

//呼叫的是 library_materials::check_in()

thing1.check_in();

library_materials &thing2=book;

// 現在引發的是 book::check_in()

thing2.check_in();

雖然可以直接或者間接處理繼承體系中的乙個基類物件,但只有通過指標或者引用的間接處理,才支援oo程式設計所需的多型性質;

c++以下列方法支援多型:

1、經由一組隱含的轉化操作;如 將乙個派生類指標轉化為乙個指向其基類的指標:shape *ps= new circle();

2、經由virtual function 機制:ps->rotate();

3、經由dynamic_cast 和 typeid 運算子:if( circle *pc = dynamic_cast< circle* >( ps ) )

乙個類物件需要的記憶體空間:

1、非靜態成員變數的總和大小;

2、加上任何由位元組對齊的需求而填補上去的空間;

3、加上為了支援virtual 而由內部產生的額外負擔。

class zooanimal

;class bear:public zooanimal

; dances dances_known;

int cell_block;

}; bear b("yogi");

zooanimal*pz=&b;

bear *pb=&b;

它們每個都指向 bear object 的第乙個位元組,但 pb 所涵蓋的位址包含整個 bear object;而 pz 所涵蓋的位址只包含 bear object 中的 zooanimal subobject.

圖4  記憶體布局

C 物件模型(一)

我們先定義乙個基類。class base virtual base void no static member function static void static member function virtual void virtual member function private int n...

C 物件模型筆記 一 C 物件

c 支援了資料和方法的聯絡。對 c 來說,他的布局成本就是 1.none static data member 2.a pointer to virtue table 3.the pointer to virtue class 而成員函式,並不包括在 c 物件裡。還而言之,每乙個非 inline 成...

c 物件模型分析(一)

深夜睡不著覺,很痛苦。關於物件 第一部分 1.c 加上封裝之後的成本 a.成員資料 c class中的成員資料等同於c中struct中的資料 c.內聯的成員函式 擁有乙個或零個函式定義的內聯函式會在每個使用者身上產生乙個函式實體 d.virtual function機制 支援乙個有效率的 執行期繫結...