2017-08-22 23 views
1

私は、継承について学んでいるうちに、すでに派生したクラスを継承することができ、最も派生したクラスから継承することができるので、メンバーに直接。私は次のように私が何を意味するかを示し思う:サブクラスまたは孫の基底クラスへのアクセス

mostderived.Base::member++を実行して、だから、
#include <iostream> 

struct Base 
{ 
    int member = 0;  // All members null 
}; 

struct D1 : Base {}; 
struct D2 : Base {}; 
struct D3 : Base {}; 
struct D4 : Base {}; 

struct MostDerived : D1, D2, D3, D4 {}; // I know MostDerived now has 4 copies of Base 


int main() 
{ 
    MostDerived mostderived{}; 
    mostderived.D2::member = 2;      // D2::Base::member = 2 
    mostderived.D3::member = 3;      // D3::Base::member = 3 
    mostderived.D4::member = 4;      // D4::Base::member = 4 

    std::cout << mostderived.D1::member << '\n';  // Haven't touched D1, is still zero 
    std::cout << mostderived.D1::Base::member << '\n'; // Equals 0, equivalent to above line 
    std::cout << mostderived.Base::member << '\n';  // Read Base scope directly from most derived, equals zero 

    mostderived.Base::member++;       // Assign to member in Base scope directly from mostderived 
                 // it now equals 1 

    std::cout << mostderived.D1::member << '\n';  // But also does D1::member equal 1 

    return 0; 
} 

私はmostderived.D1::memberの値を変更しました。私はちょうどそのようなBaseのようなものにアクセスすると、なぜそれが特に変更されたのだろうと思っていますD1のメンバーのコピー。レイアウトを描く方法は、D1,D2,,D4を含み、それぞれにBaseが含まれているので、次のようになります。

enter image description here

+0

ええ、私はしばしば継承を超えて構成を好むと聞いて、私のデバッガは基本クラスを "含む"として実際に派生クラスを表示するので、継承は基本クラスを派生クラス定義もちろん、他の機能も付属しています。 – Zebrafish

+0

コードは 'main.cpp:24:40:error: 'Base'が 'MostDerived'のあいまいなベースであるために構築されません std :: cout << mostderived.D1 :: Base :: member << '\ n'; ' – kim366

+0

@ kim366それは面白いです。私はVisual Studioで試しただけなので、多分あいまいなものになるはずです。私は曖昧な部分がmostderived.Base :: memberの部分だと思っていただろう – Zebrafish

答えて

1

So by doing mostderived.Base::member++ I changed the value of mostderived.D1::member.

D1-4から 'MostDerived' 継承する場合、その後、

mostderived.Base::member++; 
       ^

はあいまいです。

Becouse 'MostDerived' は、この階層

int Base::member 
int Base::member 
int Base::member 
int Base::member 

BaseはD1-4のいずれかと交換することができました。


あなたは仮想継承

struct D1 : virtual Base {}; 
struct D2 : virtual Base {}; 
struct D3 : virtual Base {}; 
struct D4 : virtual Base {}; 

を使用する場合は、それが何をもはや曖昧でwouldntのように、それは、ちょうど基本クラスを含んでいるでしょう 'MostDerived' ことを引き起こす

mostderived.Base::member++; 

これまでにmemberにアクセスすることは可能です。D1-4

012すべてのD'sの共有同じ変数からの経過の
mostderived.D1::member = 1; 
mostderived.D4::member = 4; 

、それはすべてのために同じ値を持つことになり、例:

MostDerived mostderived{}; 
mostderived.Base::member = 1; 
std::cout << mostderived.D1::member << mostderived.D2::member << mostderived.D3::member << mostderived.D4::member; 

1111を印刷します。

+0

kim366は、リンクされたオンラインコンパイラではコンパイルしないと指摘しています。それは間違いなくあいまいです。私はVisual Studioで動作していました。 – Zebrafish

+0

他に質問がありますか? :-) –

+0

いいえ、私はそれが曖昧な表現であり、おそらく私のコンパイラのバグであることを理解しました。ありがとう。 – Zebrafish

関連する問題