2012-12-23 59 views
1

我得到了一個錯誤ambiguous access mg。但mg僅受到公開訪問的保護和繼承。爲什麼這樣?請扔一些光。謝謝你的時間 !C++中模糊的訪問錯誤

class A{  
    protected:  
     int mg; 
     static int ms; 
};  

class B : public A{  
    protected:  
     using A::ms; 
};  

class C : public A, public B{  
    public:  
     void fn(){ 
      cout << mg; 
      cout << ms; 
     } 
}; 

int A::ms = 0; 

int main(){  
    C c; 
    c .fn(); 
} 
+1

爲什麼你需要明確地從A中導出C?也許這個例子太削減了,以至於無法使用。 –

回答

2

在這個例子中,你必須在C類的基類A的兩個副本,如B已經從A派生。這也給了基類的AC

class C : public B{  
    public:  
    void fn(){ 
    cout << mg; 
    cout << ms; 
    } 
}; 

這個問題被稱爲「死亡的鑽石」,是用來解釋多重繼承的危險。除此之外,它已被縮減爲「死亡三角」。

2

CA::mg可以指從A繼承了一個,或向所述一個從B繼承因爲B繼承A。所以這個呼叫是不明確的:你真的指哪一個?

使用虛擬繼承可以解決這個問題。你可以看到this answer這個問題與你的問題非常相似:鑽石繼承。

+1

你已經發現了這個問題,但虛擬繼承很可能不是一個合適的解決方案。 –

+0

同意,但我只是將虛擬繼承作爲可能的解決方案,而不是唯一的解決方案。 – Synxis