c++物件模型可以概括為以下2部分:
1、語言中直接支援物件導向程式設計的部分;
2、對於各種支援的底層實現機制。
語言中直接支援物件導向程式設計的部分,如建構函式、析構函式、虛函式、繼承(單繼承、多繼承、虛繼承)、多型等等。本文重點介紹底層實現機制。
在c語言中,「資料」和「處理資料的操作(函式)」是分開宣告的,也就是說,語言本身並沒有支援「資料和函式」之間的關聯性。在c++中,通過抽象資料型別(abstract data type,adt),在類中定義資料和函式,來實現資料和函式直接的繫結。概括來說,在c++類中有兩種資料成員:static,nonstatic;三種成員函式:static、nonstatic、virtual。
析構函式應當都是虛函式,除非明確該類不做基類(不被其他類繼承)。基類的析構函式宣告為虛函式,這樣做是為了確保釋放派生物件時,按照正確的順序呼叫析構函式。
從前面介紹的c++物件模型可以知道,如果析構函式不定義為虛函式,那麼派生類就不會重寫基類的析構函式,在有多型行為的時候,派生類的析構函式不會被呼叫到(有記憶體洩漏的風險!)。
例如,通過new乙個派生類物件,賦給基類指標,然後delete基類指標。
void test_vitual_destructor()
如果基類的析構函式不是析構函式:
注意,缺少了派生類的析構函式呼叫。把析構函式宣告為虛函式,呼叫就正常了:
[1] 深度探索c++物件模型,侯捷
[3] 關於虛函式的實現原理也可以參考關於虛函式的那些事兒
c 物件模型
很久之前就想總結一下c 的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。1.程式使用記憶體區 乙個程式占用的記憶體區一般分為5種 1 全域性 靜態資料區 儲存全域性變數及靜態變數 包括全域性靜態變數和區域性靜態變數 2 常量資料區 儲存程式中的常量字串等。3 區 儲存程式的 4...
C 物件模型
很久之前就想總結一下c 的記憶體使用機制。直到現在剛考完試之制,去實習之前,才有時間完成這事。1.程式使用記憶體區 乙個程式占用的記憶體區一般分為5種 1 全域性 靜態資料區 儲存全域性變數及靜態變數 包括全域性靜態變數和區域性靜態變數 2 常量資料區 儲存程式中的常量字串等。3 區 儲存程式的 4...
C 物件模型
簡單物件模型 乙個c 物件儲存了所有指向成員的指標,而成員本身不儲存在物件中。也就是說不論資料成員還是成員函式,也不論這個是普通成員函式還是虛函式,它們都儲存在物件本身之外,同時物件儲存指向它們的指標。示意圖如右。簡單物件模型對於編譯器來說雖然極盡簡單,但同時付出的代價是空間和執行期的效率.顯而易見...