【问题标题】:Why need to be a friend to access protected members?为什么需要成为朋友才能访问受保护的成员?
【发布时间】:2014-02-20 21:58:55
【问题描述】:

当我在Sub::f() 中并尝试访问Base* b 指针指向的另一个子类的受保护成员时,直到Sub 成为Base 的朋友时它才会编译。为什么我需要这样做?

class Base{
//friend class Sub;
protected:
    int i;
    virtual void f() = 0;
};

class Sub : public Base{
    Base* b;
public:
    Sub(Base* ba) : b(ba){}
    void f(){
        b->f();
        cout << b->i << endl;
    }
};

【问题讨论】:

  • 因为这就是friend
  • 因为你只能让你的朋友碰你的私处。
  • 但是Sub 继承了Base 的所有内容。派生类不能访问其基类的受保护成员吗?
  • 如果您遇到特定问题,请尝试发布更完整和独立的示例。

标签: c++ friend protected


【解决方案1】:

protected只能在层次结构中访问,但如果你想要例外,交朋友是方法。

Friend类可以访问privateprotected类的成员。

【讨论】:

    【解决方案2】:

    protected 成员可以在自己的类和派生类中访问,但不能在类外访问,因此如果您想这样做,请使用“朋友”。由于 CPP 提供的这一特性,CPP 不是“完全或完整”的面向对象编程语言(漏洞),因为我们也可以在朋友的帮助下访问私有成员。

    【讨论】:

      【解决方案3】:

      b-&gt;f()b-&gt;i 访问的不是他自己的基地的fb,而是其他基地的(b 指向的那个)

      sub    base
      |____b_|___i___|
           |
           |_
             |
             V
      sub    base
      |____b_|___i___|
      

      【讨论】:

      • Thx;) 这张照片不错。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 1970-01-01
      • 1970-01-01
      • 2021-01-09
      • 2021-11-01
      • 2020-08-13
      相关资源
      最近更新 更多