2012-12-23 42 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