提问人:Manarbek 提问时间:8/14/2023 更新时间:9/8/2023 访问量:2466
为什么派生类可以访问基类的私有字段?
Why does the derived class have access to the private field of the base class?
问:
class Base {
public:
class FirstBase {
friend class Base;
int x = 10;
};
class SecondBase : public FirstBase {
public:
SecondBase() : FirstBase() {}
void t() { std::cout << FirstBase::x; }
};
};
这段代码可以编译并工作,但我不明白它为什么工作。可以解释或引用来源阅读吗?
我使用 gcc 版本 11.4.0 std=C++17
答:
17赞
simre
8/14/2023
#1
因为是朋友。因此,您可以在内部访问.而且在里面,所以可以进入。如果您删除好友关系或移出 ,它将立即中断,正如您预期的那样。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; }
};
};
31赞
molbdnilo
8/14/2023
#2
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; }
};
};
评论
0赞
Deduplicator
8/15/2023
友谊不是传递的,除此之外,这是真的。
3赞
molbdnilo
8/15/2023
@Deduplicator 根据标准,它可以是“嵌套类和本地类”。
0赞
Deduplicator
8/15/2023
我的意思是,成为朋友的朋友并不意味着什么。
3赞
molbdnilo
8/15/2023
@Deduplicator 没有人说它确实如此。在标准中指定的情况下,访问权限是可传递的。
评论
x
SecondBase