閱讀683 返回首頁    go 阿裏雲 go 技術社區[雲棲]


C++虛繼承

首先看一段代碼:

class B
{
public :
int b;
};
class D: virtual public B
{
public :
int d;
};
 
int _tmain(int argc, _TCHAR* argv[])
{
cout<<sizeof(D)<<endl;
};


    在vs輸出12,當將virtual關鍵字去掉之後,輸出8;可見虛擬繼承需要額外的空間開銷。在vs中,引入了所謂的“虛基類表”(類似虛函數表),同時每個Class Object中有一個指向虛基類表的指針,虛基類表中存放著對應虛基類對象的指針(地址)。

那麼兩個虛基類的情況如何呢?我們修改代碼如下:

class B
{
public :
int b;
};
 
class B1
{
public :
int b1;
};
 
class D: virtual public B,virtual public B1
{
public :
int d;
};


結果輸出為16,隻是增加了新的基類的數據成員(int),並沒有增加更多的額外空間,所以進一步說明“虛基類表”的存在,因為所有的虛基類指針都在虛基類表中。

 

最後更新:2017-04-03 12:56:00

  上一篇:go listview滑動刪除
  下一篇:go Android 對ScrollView滾動監聽,實現美團、大眾點評的購買懸浮效果