2011-02-05 55 views
0

可能重複:
gcc c++ virtual inheritance problem關於虛基類和虛擬繼承在C++

大家好, 我讀的有效C++由斯科特·邁爾斯書。有人提到關於虛擬基類和虛擬繼承如下。

控制虛擬基類初始化的規則比非虛擬基的規則更加複雜和不直觀。初始化虛擬基地的責任由層次結構中最派生的類承擔。當一個新的派生類中被添加到層次結構,它必須承擔其虛基類初始化responsiblities(直接和間接)

問題是在上面的語句是什麼規則虛基calsses的初始化,什麼是派生類的責任必須如上文所述。請以實例解釋。

謝謝!

+3

請參閱[這裏](http://stackoverflow.com/questions/4849289/virtual-base-class-and-initialization-lists)或[這裏](http://stackoverflow.com/questions/2126522/ GCC-C-虛擬繼承-問題)。 – 2011-02-05 14:12:56

回答

3

讓我通過一個例子來解釋報價。假設,你這些類,

struct A { A(int x) {} }; 
struct B : virtual A { B(int x) : A(x) {} }; 
struct C : virtual A { C(int x) : A(x) {} }; 

注:A是虛擬的基地!

現在,定義DBC得出:

struct D : B, C 
{ 
    //correct constructor - because A(x) is "present" in the initialization-list 
    D(int x) : A(x), B(x), C(x) { } 

    //wrong constructor - because A(x) is "absent" from the initialization-list! 
    //D(int x) :B(x), C(x) { } 

}; 

請注意,D是層次結構的派生類,所以初始化A責任與D,即爲什麼D明確地在其構造函數初始化列表中寫入A(x)(參見上文)。如果你寫只有B(x)C(x),那麼它甚至不會編譯。看到這個:http://www.ideone.com/sO6m5

但是,一旦你寫A(x),它編譯罰款。看到這一點:http://www.ideone.com/kiwh0

現在再次讀取報價,並注意的粗體文字:

管理虛基類的初始化 的規則更 複雜,非 不太直觀是那些非虛擬基地。 初始化虛擬基地的 響應能力由層次結構中的最多 派生類承擔。當 新的派生類被添加到 層次,它必須承擔其 虛擬基礎 初始化responsiblities(包括直接和間接 )

我希望這個解釋可以幫助你理解概念!