2012-06-20 96 views
0

我有關於虛擬基類的問題。創建虛擬基類對象

class a 
{ 
public: 
    a(); 
    ~a(); 
}; 

class b: virtual public a 
{ 
public: 
    b(); 
    ~b(); 
}; 

class c: virtual public a 
{ 
public: 
    c(); 
    ~c(); 
}; 

class e: public b, c 
{ 
public: 
    e(); 
    ~e(); 
}; 

每當我創建e類的一個對象,通過該類a對象將在e產生的呢?

+3

通過任何一個。虛擬基類與從它們繼承的類是「分離的」(這實際上是虛擬繼承的本質)。你甚至可以像'e :: e():a(bla),b(),c(){...}一樣調用'a'的非默認構造函數' –

回答

2

兩者都會被共享。

如果你的問題是關於佈局,這是不明確的。是的,虛擬繼承已經到位,一個對象 - 當它不是一個完整的對象時 - 可能在內存中是不連續的。

如果a沒有默認構造函數,則需要e中的初始化列表,它將提供所需的參數;那些由b和c的構造函數暗示的將被忽略。

1

將出現單個共享實例。

編譯器會給B和C兩個vpointer,因爲直到運行時纔會知道A的內存偏移。當創建Ë的情況下,它也將建立A,B和C.

的實例

B和C含有在其虛函數表,其存儲的偏移到類A的虛擬指針,這將在運行時用於指向共享的A對象。