从 sub-sub-class 或孙子访问基础 class
Accessing Base class from sub-sub-class or grandchild
我只是想弄清楚一些事情,因为在学习继承时我注意到我可以从已经派生的 class 继承,并且从最派生的 class 访问 Base class的直接会员。我认为以下说明了我的意思:
#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.Base::member++
我改变了 mostderived.D1::member
的值。我只是想知道这样访问 Base
是否有意义,以及为什么它特别更改了 D1
的成员副本。我描绘布局的方式是 MostDerived
包含 D1
、D2
、D3
、D4
,并且每个包含一个 Base
, 所以它看起来像下面这样。
So by doing mostderived.Base::member++ I changed the value of
mostderived.D1::member.
如果'MostDerived'继承自D1-4,则
mostderived.Base::member++;
^
有歧义。
因为'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 {};
这会导致'MostDerived'只包含一个基class,所以做
就不会有歧义了
mostderived.Base::member++;
并且可以通过所有 D1-4
访问此 member
mostderived.D1::member = 1;
mostderived.D4::member = 4;
当然,因为所有 D 都共享同一个变量,所以它对所有人都有相同的值,例如:
MostDerived mostderived{};
mostderived.Base::member = 1;
std::cout << mostderived.D1::member << mostderived.D2::member << mostderived.D3::member << mostderived.D4::member;
将打印 1111
.
我只是想弄清楚一些事情,因为在学习继承时我注意到我可以从已经派生的 class 继承,并且从最派生的 class 访问 Base class的直接会员。我认为以下说明了我的意思:
#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.Base::member++
我改变了 mostderived.D1::member
的值。我只是想知道这样访问 Base
是否有意义,以及为什么它特别更改了 D1
的成员副本。我描绘布局的方式是 MostDerived
包含 D1
、D2
、D3
、D4
,并且每个包含一个 Base
, 所以它看起来像下面这样。
So by doing mostderived.Base::member++ I changed the value of mostderived.D1::member.
如果'MostDerived'继承自D1-4,则
mostderived.Base::member++;
^
有歧义。
因为'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 {};
这会导致'MostDerived'只包含一个基class,所以做
就不会有歧义了mostderived.Base::member++;
并且可以通过所有 D1-4
访问此member
mostderived.D1::member = 1;
mostderived.D4::member = 4;
当然,因为所有 D 都共享同一个变量,所以它对所有人都有相同的值,例如:
MostDerived mostderived{};
mostderived.Base::member = 1;
std::cout << mostderived.D1::member << mostderived.D2::member << mostderived.D3::member << mostderived.D4::member;
将打印 1111
.