1

我有一个错误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(); 
}  
4

2 回答 2

2

A在此示例中,您在class 中有两个基类副本C,它们B已经派生自A. A这也给出了in的基类C

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

这个问题被称为“死亡之钻”,用来解释多重继承的危险。除了这里,它已被简化为“死亡三角”。

于 2012-12-23T17:53:26.907 回答
2

in C,A::mg可以指继承自的那个A,或者指继承自的那个,B因为B继承A。所以这个电话是模棱两可的:你真正指的是哪一个?

使用虚拟继承可以解决这个问题。您可以看到这个答案与您的问题非常相似:钻石继承。

于 2012-12-23T17:53:38.613 回答