私は、継承について学んでいるうちに、すでに派生したクラスを継承することができ、最も派生したクラスから継承することができるので、メンバーに直接。私は次のように私が何を意味するかを示し思う:サブクラスまたは孫の基底クラスへのアクセス
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
が含まれているので、次のようになります。
ええ、私はしばしば継承を超えて構成を好むと聞いて、私のデバッガは基本クラスを "含む"として実際に派生クラスを表示するので、継承は基本クラスを派生クラス定義もちろん、他の機能も付属しています。 – Zebrafish
コードは 'main.cpp:24:40:error: 'Base'が 'MostDerived'のあいまいなベースであるために構築されません std :: cout << mostderived.D1 :: Base :: member << '\ n'; ' – kim366
@ kim366それは面白いです。私はVisual Studioで試しただけなので、多分あいまいなものになるはずです。私は曖昧な部分がmostderived.Base :: memberの部分だと思っていただろう – Zebrafish