2013-06-20 50 views
1
class B 
{ 
public: 
    B(char c = 'a') : m_c(c) {} 

public: 
    fun(); 

private: 
    char m_c; 
}; 

class C: virtual public B 
{ }; 

class D: virtual public B 
{ }; 

class E 
    : public C 
    , public D 
{ }; 

我只是想知道「虛擬」關鍵字是如何幫助該類E只有一個類B的副本?什麼虛擬關鍵字在「C類」做了什麼,以便稍後影響其派生類(正如你可以理解的,我只是想了解虛擬繼承的基本工作。我試圖找出這個問題的答案,但沒有得到它是否正確,如果任何人知道任何良好的聯繫,即使這可以幫助。)。換句話說,虛擬繼承如何工作

//1) 
class C: virtual public B 
{ }; 

//2) 
class C: public B 
{ }; 

如果我們不進一步駕駛C類,在創建它的對象時,1)和2)之間會有什麼特別的區別。

+0

此鏈接可能對您有用:http://en.wikipedia.org/wiki/Virtual_inheritance –

回答

1

使用關鍵字virtual閱讀「我將分享」。如果不讀「我不會分享」既CD既具有virtual public B

所以,無論是準備B股

在最後一個例子class C: public B,C類不會分享 - 即有它自己的拷貝。

0

如果我們沒有進一步深入C類課程,在創建它的對象時,1)和2)之間會有什麼特別的區別。

  • 建設虛擬鹼基的其他基類之前發生,即使那些其他基地出現在靠前的類定義中列出,並破壞發生之後。這不會影響你的「C」類,但是如果你添加了另一個基類,它可以。

  • 具有虛擬基類的版本的默認構造函數永遠不會「微不足道」,並帶有各種含義。例如,即使構造函數尚未運行(即主要與動態加載的對象有關),也可以安全地獲取構造對象的數據成員的地址,但在聯合使用時會有一些不同。

本標準沒有規定實施細節,但可能虛擬基地級別稍大,和/或建造和/或銷燬可能稍微慢一點。

對於更長的派生鏈還有一些其他的怪癖,例如:如果中間類的構造函數的初始化列表指定虛擬基礎構造的參數,那麼它們將被忽略,以支持派生類的更多構造函數,並且可以省略即使虛擬基礎中沒有默認構造函數,也可以從中間類調用構造函數。