2016-05-15 7 views
0

仮想基本クラスを使用すると、多重継承はどのように機能しますか? バーチャルベースクラスをいつ、どこで使うべきかを私たちはどのように知っていますか?仮想基本クラスを使用すると、多重継承はどのように機能しますか?

次のコードでは、どのように出力を取得しますか?

class A { 
    public: 
     A() { 
      cout<<"\t A"; 
     } 
}; 

class B: public A { 
    public: 
     B() { 
      cout<<"\t B"; 
     } 
}; 

class C: public B { 
    public: 
     C() { 
      cout<<"\t C"; 
     } 
}; 

class D: virtual C { 
    public: 
     D() { 
      cout<<"\t D"; 
     } 
}; 

class E: virtual C, virtual D { 
    public: 
     E() { 
      cout<<"\t E"; 
     } 
}; 

class F: public B, virtual E { 
    public:  
     F() { 
      cout<<"\t F"; 
     } 
}; 

int main() { 
    F obj; 
} 

出力は次のようになります。

 A  B  C  D  E  A  B  F 

私はどのように警告 による曖昧に[警告]ダイレクトベース 'B' にアクセスできなく 'F' で[デフォルトで有効になって]

を取得します私はそれを修正する??

+0

私が最初にあなたがしたいです何を出力再設計 –

+2

を検討します取得する?どのように "修正する"かは、あなたが達成しようとしているものによって決まります。 – interjay

+1

仮想継承は、最初に導入されたレベルからのみ適用されます。 「C」と「D」のどちらも実質的に継承していないので、両方から継承すると(基本的に)重複した基底とあいまいさが残っています。 – StoryTeller

答えて

2

あなたは(ストーリーテラーのコメントを参照してください)次の宣言でvirtualを見逃している:ここで

class B: public virtual A {...}; 
class C: public virtual B {...}; 
class F: public virtual B, virtual E {...}; 

はデモです:http://cpp.sh/6k2be

関連する問題