2017-04-05 38 views
-1

我有以下結構違抗作爲偏差與虛擬關鍵字

struct A{ 
    string s; 
    A() { 
     cout<<"in a default\n"; 
    } 
    A(string t): s(t) { 
     cout<<"in a param \n"; 
    } 
}; 

struct B: virtual public A{ 
    B(): A("B"){ 

     cout<<"in b\n"; 
    } 
}; 

struct C: virtual public A {}; 
struct D: public B, public C {}; 
int main() 
{ 
D d; 
} 

在C和B A作爲虛基類,輸出如下

in a default 
in b 

隨着A作爲虛擬基類只有B,輸出如下

in a default 
in b 
in a default 

用A作爲虛擬基類只有C,輸出如下

in a default 
in a param 
in b 

和在沒有進行虛擬基類,輸出如下

in a param 
in b 
in a default 

任何一個可以解釋我的偏差?

+0

因爲這就是虛擬基類的意思。它們只在超類鏈中出現過一次。 – EJP

+0

爲什麼在第一種情況下它是在默認情況下而不是在param中? – unixlover

+0

虛擬類是多路徑繼承的特例,它避免了來自同一基類的重複數據。 – rsp

回答