摘要:c++物件導向模型的主要特徵是:(1)類和封裝性(2)繼承性(3)多型性。多型性在前兩者和虛函式的基礎上實現,而虛函式正是實現物件導向的核心機制。
關鍵字:虛函式 繼承 多型
在物件導向的程式設計中,系統被看成由多個物件組成,通過物件之間的通訊形成了系統。其主要特徵是:(1)類和封裝性(2)繼承性(3)多型性。多型性在前兩者和虛函式的基礎上實現,而虛函式正是實現物件導向的核心機制。
在c++中,有兩種資料成員: 靜態的(static)和非靜態的(nonstatic),有三種成員函式: 靜態函式、非靜態函式和虛函式。在stroustrup當初設計的c++模型中,非靜態資料成員被存放在每乙個物件之內,靜態資料成員則被存放在所有的物件之外。靜態成員函式和非靜態成員函式也被存放在所有的物件之外。虛函式則以兩個步驟來支援:
舉例說明,有class a定義如下:
class a ;
class a的記憶體布局如下:(為簡化說明,將虛函式表中第乙個記錄的type_info object略去)
圖2-1類a的物件記憶體圖
class b繼承於class a,定義如下:
class b : pulic a ;
class b的記憶體布局如下:
圖2-2類b的物件記憶體圖
假設有如下一段**:
a objecta;
bobjectb;
a *pa = &objecta;
pa->func1();
pa->func2();
pa = &objectb;
pa->func1();
pa->func2();
第乙個pa->func1()語句實際呼叫的是a::func1(),編譯器會將它轉換為( * pa->vptr[1] )( this ),pa->vptr[1]即a::func1,而第二個pa->func1()語句呼叫b::func1(),編譯器同樣將它轉換為( * pa->vptr[1] )( this ),只是此時pa->vptr[1]已經關聯到b::func1。第乙個pa->func2()語句實際呼叫a::func2(),編譯器將它轉換為( * pa->vptr[2] )( this ),pa->vptr[2]即a::func2,而第二個pa->func2()語句呼叫b::func2()。
在繼承和虛函式的基礎上,c++實現了多型。
class c、class d、class e定義如下:
class c ;
class d : public c ;
class e : public b, public d ;
class a 、class b、class c、class d、class e的關係如圖所示:
圖2-4類e的物件記憶體圖
類e物件的記憶體布局中有兩個vptr,第乙個派生自類b,第二個派生自類d。通過指向第二或後繼的基類的指標來呼叫派生類的虛函式,需要在執行時以適當的偏移值(offset)調整this指標,以使指向類c的物件或類d的物件的指標能正確呼叫d::func3和e::func4。
比較有效率的解決方法是利用thunk技術,thunk是一小段彙編(assembly)**,用來以適當的偏移值調整this指標,並跳轉到相應的虛函式處。例如,通過乙個指向類d的物件的指標呼叫func4(pd->func4),其相關thunk的類c**如下所示:
this += sizeof( b );
e::fun4( this );
參考:
潘愛民***講義
stanley lippman,《inside c++ object model》
C 物件導向模型
摘要 c 物件導向模型的主要特徵是 1 類和封裝性 2 繼承性 3 多型性。多型性在前兩者和虛函式的基礎上實現,而虛函式正是實現物件導向的核心機制。關鍵字 虛函式 繼承 多型 在物件導向的程式設計中,系統被看成由多個物件組成,通過物件之間的通訊形成了系統。其主要特徵是 1 類和封裝性 2 繼承性 3...
C 物件導向模型初探
前言 c 物件模型可以概括為以下2部分 1.語言中直接支援物件導向程式設計的部分,主要涉及如建構函式 析構函式 虛函式 繼承 單繼承 多繼承 虛繼承 多型等等。2.對於各種支援的底層實現機制。在c語言中,資料 和 處理資料的操作 函式 是分開來宣告的,也就是說,語言本身並沒有支援 資料和函式 之間的...
C 中物件導向模型初探
這裡主要概述成員函式的本質,這裡只是用c語言的方式來實現c 中類的功能,並不代表c 編譯器的真正做法,但c 編譯器實現原理大致如此。注釋部分為c 的實現方式,也是c 編譯器的實現原理 總結 1 c 類物件中的成員變數和成員函式是分開儲存的,c語言的記憶體四區模型仍然有效 2 c 中類的普通成員函式都...