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

この例では、すでに から派生しているため、クラス に基底クラスの 2 つのコピーがありAます。これにより、 inの基本クラスも得られます。CBAAC

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

この問題は「死のダイヤモンド」として知られており、多重継承の危険性を説明するために使用されます。ここを除いて、「死の三角形」に縮小されています。

于 2012-12-23T17:53:26.907 に答える
2

in はC、から継承されたもの、またはinheritsのため継承さA::mgれたものを参照できます。したがって、この呼び出しはあいまいです。実際にどちらを指しているのでしょうか。ABBA

仮想継承を使用すると、この問題を解決できます。この回答は、あなたのものと非常によく似た問題であるダイヤモンドの継承を見ることができます。

于 2012-12-23T17:53:38.613 に答える