c++虛繼承分析及物件模型
虛繼承和虛基類的定義是非常的簡單的,但是在c++語言中虛繼承作為乙個比較生僻的但是又是絕對必要的組成部份而存在著,並且其行為和模型均表現出和一般的繼承體系之間的巨大的差異(包括訪問效能上的差異),現在我們對虛繼承和虛基類進行研究。
定義:
虛繼承:在繼承定義中包含了virtual關鍵字的繼承關係;
虛基類:在虛繼承體系中的通過virtual繼承而來的基類,需要注意的是:
classcsubclass : virtual public cbase {};其中cbase稱之為csubclass的虛基類,而不是說cbase就是個虛基類,因為cbase還可以不不是虛繼承體系中的基類。
語法:
語法有語言的本身的定義所決定,總體上來說非常的簡單,如下:
class csubclass : public virtual cbaseclass {};
其中可以採用public、protected、private三種不同的繼承關鍵字進行修飾,只要確保包含virtual就可以了,這樣一來就形成了虛繼承體系,同時cbaseclass就成為了csubclass的虛基類了。
其實並沒有那麼的簡單,如果出現虛繼承體系的進一步繼承會出現什麼樣的狀況呢?如下所示:
class base
virtualvoid f();
class subbase1:virtualpublic base
virtualvoid g();
class subbase2:virtualpublic base
virtualvoid h();
classderived:public subbase1,public subbase2
virtualvoid k();
classsubderived:public derived};
注意上面**中的derived和subderived兩個類的建構函式初始化列表中的內容。可以發現其中均包含了虛基類base的初始化工作,如果沒有這個初始化語句就會導致編譯時錯誤,為什麼會這樣呢?
實驗環境(window7 x64 +visual studio 2010)
模型分析:
單一虛擬繼承:
測試**:
#include
"stdafx.h"
#include
usingnamespacestd;
class base
virtualvoid f();
class subbase1:virtualpublic base
virtualvoid g();
int _tmain(intargc, _tchar* argv)
執行結果:
物件記憶體模型圖:(subbase1物件模型)
多重虛擬繼承:
// demo.cpp : 定¡§
義°?控?
制?臺¬¡§應®|
用®?程¨¬
序¨°的ì?
入¨?口¨²
點ì?。¡ê
//#include
"stdafx.h"
#include
usingnamespacestd;
class base
virtualvoid f();
class subbase1:virtualpublic base
virtualvoid g();
class subbase2:virtualpublic base
virtualvoid h();
classderived:public subbase1,public subbase2
virtualvoid k();
classsubderived:public derived
};typedefvoid (*fun)(void);
int _tmain(intargc, _tchar* argv)
結果:
物件記憶體模型圖:(deirved物件模型)
該模型增加析構函式並且是析構函式:
**:class base
virtual void f()
virtual void g();
class subbase2:virtual public base
virtual void h();
class derived:public subbase1, public subbase2
virtual void k();
物件模型圖:
實驗結論:
1、虛擬繼承與普通繼承不同,把虛擬基類放在物件記憶體最後部分。各個子類通過偏移量找到這個虛基類。
2、虛擬繼承中多了乙個vbptr指標(虛基類表指標),指向虛擬基類。
3、vbptr指向一張表,裡面放著位址偏移量。
專案
說明
第一項:到本類偏移量
-4:有虛函式時;0:無虛函式
第二項:到虛基類偏移量
第三項:是0
起分割作用。因為在實際記憶體中,subbase1和subbase2的這兩張虛基類表示放在一起的。
重要補充:
在gcc環境下最後乙個模型記憶體物件圖:
乙個參考部落格:
C 物件模型 單繼承,多繼承,虛繼承
有兩個概念可以解釋c 物件模型 語言中直接支援物件導向程式設計的部分。對於各種支援的底層實現機制。資料成員分為靜態和非靜態,成員函式有靜態非靜態以及虛函式 class data members static和nonstatic class data functions static nonstati...
C 物件模型 單繼承,多繼承,虛繼承
有兩個概念可以解釋c 物件模型 語言中直接支援物件導向程式設計的部分。對於各種支援的底層實現機制。資料成員分為靜態和非靜態,成員函式有靜態非靜態以及虛函式 class data members static和nonstatic class data functions static nonstati...
C 物件模型 虛函式表分析
class base virtual void g virtual void h class derive public base int main typedef void func void 定義乙個函式指標型別 func f func vptr 0 f就是函式指標變數。vptr 0 是指向第乙...