c ++中的模糊访问错误

时间:2012-12-23 17:42:34

标签: c++ class inheritance

我收到了错误ambiguous access mg。但mg仅受公共访问保护和继承。为什么会这样?请点亮一些。谢谢你的时间!

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(); 
}  

2 个答案:

答案 0 :(得分:2)

在此示例中,您在类A中有两个基类C的副本,因为B已从A派生。这也在A中提供了C的基类:

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

这个问题被称为“死亡钻石”,用于解释多重继承的危险。除此之外,它已被缩减为“死亡三角”。

答案 1 :(得分:2)

C中的

A::mg可以引用从A继承的,或从B继承的那个,因为B继承了A }。所以这个电话是模棱两可的:你真的指的是哪一个?

使用虚拟继承可以解决此问题。您可以看到问题this answer与您的问题非常相似:钻石继承。