为什么派生类可以访问基类的私有字段?

Why does the derived class have access to the private field of the base class?

提问人:Manarbek 提问时间:8/14/2023 更新时间:9/8/2023 访问量:2466

问:

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

C++ 继承 C++17 好友

评论

1赞 463035818_is_not_an_ai 8/14/2023
相关 stackoverflow.com/q/486099/4117728
0赞 463035818_is_not_an_ai 8/14/2023
请注意,继承对于示例不是必需的。您可以创建静态成员,并且仍然具有访问权限 godbolt.org/z/zWxsYWjo5xSecondBase

答:

17赞 simre 8/14/2023 #1

因为是朋友。因此,您可以在内部访问.而且在里面,所以可以进入。如果您删除好友关系或移出 ,它将立即中断,正如您预期的那样。BaseFirstBaseBaseFirstBaseSecondBaseBaseSecondBaseFirstBaseSecondBaseBase

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是 的朋友,可以访问任何可以访问的东西。FirstBaseSecondBaseBase

来自最新草案:
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 没有人说它确实如此。标准中指定的情况下,访问权限是可传递的。