深度探索C 物件模型 (1)關於物件

2021-09-01 08:38:44 字數 2028 閱讀 2237

哎 再開新坑,希望19年能把開的這幾個坑都填上。

class : 類

class object : 類物件

簡單來說,c++物件模型的例項的組成包括下面幾個部分:

vtbl[0]指向type_info objext

vtbl[1]指向析構函式

vtbl[2]指向預設建構函式

繼承關係也可以指定為virtual,即共享的意思:

class

istream

:virtual

public ios

;class

ostream

:virtual

public ios

;class

isotream

:public istream ,

public ostream

;

base class不管在繼承鏈中被派生(derived)多少次,永遠只會存在乙個例項(稱為subobject)

由於被指定的object的真實型別在每乙個特定執行點之前是無法被解析的(乙個指標/引用可以指向它的子型別),所以只有通過pointer或者reference的間接處理,才可以支援oo程式設計所需的多型性質。

c++支援多型的方法:

乙個class object所需的記憶體空間由如下組成:

而乙個指標(通常引用是由指標實現的,但sizeof引用為被指向物件的大小),無論他是指向什麼型別,指標本身所需的記憶體大小是固定的:32位機上為4bytes,64位機上為8bytes。

對於同一機器,指向不同型別的指標本質上是相同的,它們唯一的不同是其定址的object不同,也就是說指標型別會告訴編譯器如何去解釋某起始位址後面乙個大小的記憶體內容,而void *指標只能持有乙個位址,需要cast後才能指出記憶體的大小及其內容。

class

animalzoo

void

rotate()

};class

bear

:virtual

public animalzoo

void

hibernate()

void

dance()

int cell_block;};

intmain()

pz指標呼叫zooanimal出現的public方法介面、public member以及bear虛函式,除此以外不能用pz直接處理bear的任何members。

對於虛函式,呼叫的例項由所指物件型別決定。

對於普通函式,呼叫的例項由指標型別決定

pb所涵蓋的位址包含整個bear object , pt所涵蓋的位址只包含zooanimal subobject。

當乙個base class object被直接初始化為(或被指定為)乙個derived class object時,derived object就會被**切割(sliced)**以塞入較小的base type記憶體中,derived type將沒有留下任何蛛絲馬跡。多型於是不再呈現,而乙個嚴格的編譯器可以在編譯器解析乙個「通過此object而觸發的virtual function呼叫操作」,因而迴避virtual機制。如果virtual function被定義為inline,則更有效率上的大收穫。

乙個pointer或乙個reference之所以支援多型,是因為她們並不引發記憶體中有任何與型別有關的記憶體委託操作,會受到改變的只有她們所指向的記憶體的大小和內容解釋方式而已

深度探索c 物件模型(1) 關於物件

一 c 物件模型 1 nonstatic data members被存於class object內部,static data member static nonstatic function放在class object之外。2 虛函式則使用虛函式表 vtbl 每個object都有virtual fu...

深度探索C 物件模型 關於物件

類成員 物件模型 struct和class在定義類物件的想相同的,均可以定義private public protected,但是如果要用於模板類或模板函式,只能用class struct能保證資料成員的空間布局,而class則不一定。c 支援多型的方法 class shape class circ...

深度探索C 物件模型 1

沒錯。就是這麼愛讀書的乙隻我 我會說是我買多了然後不看覺得可惜嗎。但是這本書倒確實是老師一直推薦讓看。template 過載輸出流,我用的不是很熟練剛好看到,溫習一下 os for int ix 0 ix os關於c 加上封裝後的布局成本 關於非靜態資料成員直接內含在每乙個class object之...