2017-10-28 11 views
3
#include<iostream> 
using namespace std; 
int main(){ 
    class c1{ 
     public: 
     int i; 
    }; 
    class c2:virtual public c1{ 
     public: 
      int j; 
    }; 
    class c3:public c1{ 
     public: 
      int k; 
    }; 
    class c4:public c2,public c3{ 


    }; 

    c4 inst1; //Its an error which indicates multiple base classes have beeen inherited 
    inst1.i=34;  

} 

私の本は、通常の基底クラスと仮想1の唯一の違いは、オブジェクトがベース回以上継承したときに発生するものである 基本クラスが仮想クラスとして継承されていても、基本クラスが2回継承されるのはなぜですか?

言います。 仮想基本クラスが使用されている場合、オブジェクトは に1つのみの基本クラスが存在します。それ以外の場合は、複数のコピーが検出されます。

しかし、このプログラムでは、基本クラスの1つが仮想として継承されていても、なぜ2つのコピーがありますか?

+2

を*「オブジェクトは、基本を継承するとき**事実**回以上」*。それはここで何が起こるかではありません。 –

+0

@BoPersson私はあなたの意見が助けたと思う。 – rimiro

+0

それは事実上両方の時代に継承されないだろう。 – EJP

答えて

4

仮想的に1つの基本クラスを継承しても、すべての兄弟基底が実質的に継承されるわけではありません。継承は、派生クラスで直接的または間接的に共有したいすべての基本クラスで仮想としてマークする必要があります。

virtualc3に追加していないため、C++コンパイラはc1を仮想継承として継承して処理することはできません。 virtual修正この問題の追加

:それはおそらく言うべき

class c3 : virtual public c1{ 
public: 
    int k; 
} 
+0

あなたはこれを説明することができますか?「仮想継承は推移的ではありません。それは...でなければなりません」また、「c3に仮想を追加しなかったので、C++コンパイラーは継承したc1を仮想として扱うことができません。 – rimiro

+0

@rimiro "推移的"は正しい言葉ではありませんでした。私はそれを書いた時、相続の異なる鎖を考えました。私は解明する答えを編集しました。 – dasblinkenlight

+0

@StoryTeller私はいくつかの質問があります:q1.cre中に存在することが保証されている2つのc1オブジェクトはありますか? q2。 c2はc2を継承するときにc1を構築する責任があります。 q3。 c1は2つのc1オブジェクトがあるので、c1を構築する責任があるのですか? – rimiro

関連する問題