【问题标题】:ambiguous access error in c++C ++中的模棱两可的访问错误
【发布时间】:2012-12-10 09:24:18
【问题描述】:

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

【问题讨论】:

  • 为什么需要从 A 显式派生 C?也许这个例子过于精简而无法使用。

标签: c++ class inheritance


【解决方案1】:

在此示例中,您在类 C 中有两个基类 A 的副本,因为 B 已经派生自 A。这也给出了CA 的基类:

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

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

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 您已经发现了问题,但虚拟继承很可能不是一个合适的解决方案。
    • 同意,但我只是将虚拟继承作为一种可能的解决方案,而不是唯一的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 2014-04-24
    • 1970-01-01
    相关资源
    最近更新 更多