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

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)

  • @Deduplicator 根据标准,它可以是“嵌套和本地类”。 (3认同)
  • @Deduplicator 没有人说确实如此。*访问权限*在标准中指定的情况下是可传递的。 (3认同)

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)