Man*_*bek 23 c++ inheritance friend c++17
class Base {
public:
class FirstBase {
friend class Base;
int x = 10;
};
class SecondBase : public FirstBase {
public:
SecondBase() : FirstBase() {}
void t() { std::cout << FirstBase::x; }
};
};
Run Code Online (Sandbox Code Playgroud)
这段代码可以编译并工作,但我不明白为什么它可以工作。可以解释或引用来源来阅读吗?
我使用 gcc 版本 11.4.0 std=C++17
mol*_*ilo 31
Base是 的朋友FirstBase,并且SecondBase可以访问任何Base可以访问的内容。
来自最新草案:
class.access,第 2 项:
类的成员还可以访问该类有权访问的所有成员。
(请注意,“嵌套”类是封闭类的成员。)
与脚注
因此,访问权限对于嵌套类和本地类来说是可传递和累积的。
请注意,继承是无关紧要的 - 这也很好:
class Base {
public:
class FirstBase {
friend class Base;
int x = 10;
};
class SecondBase {
public:
SecondBase() {}
void t(FirstBase fb) { std::cout << fb.x; }
};
};
Run Code Online (Sandbox Code Playgroud)
sim*_*mre 17
因为Base是 的朋友FirstBase。所以在里面Base你可以访问FirstBase. 并且SecondBase在里面Base所以SecondBase可以访问FirstBase。如果您删除好友关系或移至SecondBase之外Base,它就会如您所料立即破裂。
class Base {
public:
class FirstBase {
friend class Base; // This vill give access to FirstBase private members inside Base.
int x = 10;
};
// SecondBase is inside Base so you can access FirstBase private members due to the friend relationship
class SecondBase : public FirstBase {
public:
SecondBase() : FirstBase() {}
void t() { std::cout << FirstBase::x; }
};
};
Run Code Online (Sandbox Code Playgroud)