【问题标题】:friend function in derived class with private inheritance具有私有继承的派生类中的友元函数
【发布时间】:2011-01-09 16:56:59
【问题描述】:

如果 Derived 类是从 Base 类私有继承的,并且 Derived 类有友元函数 f(),那么从 Derived 类和 Base 类中 f() 可以访问哪些成员。

class Base {
public:
    int a;
protected:
    int b;
private:
    int c;
};  


class Derived: private Base {    
    void friend f() {}

public:
    int d;
protected:
    int e;
private:
    int f;
};

我知道如果一个类是从基类私有继承的,那么派生类中的所有内容都是私有的。

但是为什么在上面的代码中,函数 f() 可以访问 a、b、d、e、f 而不能访问 c?

【问题讨论】:

    标签: c++ inheritance


    【解决方案1】:

    'Friendship' 授予对声明朋友的类的访问权限 - 它不是可传递的。用一个不好的比喻——我的朋友不一定是我爸爸的朋友。

    C++ FAQ 有更多细节:

    【讨论】:

    • 在这种情况下的类比更接近于:'允许我的朋友进入我的房子不会让他们获得我父亲的保护,我无法打开自己'
    • @dribeas:是的 - 你的类比更接近 C++ 行为。
    【解决方案2】:

    Derived 的朋友可以完全访问 Derived 本身可以访问的内容 - 即 Derived 的任何成员,以及任何基类的任何公共或受保护成员,或任何公共或受保护祖父类的任何成员,但不是基类的任何私有成员,或私有祖父类的成员。

    【讨论】:

      【解决方案3】:

      派生类中不能访问私有成员。

      【讨论】:

        【解决方案4】:

        朋友功能可以访问Derived的所有成员。它无权访问 Derived 无法访问的任何 Base 成员。派生无法访问 Base::c,因为 Base::c 是私有的。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-10-08
          • 1970-01-01
          • 2012-11-30
          • 2021-11-02
          • 1970-01-01
          • 2017-04-14
          • 2021-03-26
          • 2020-04-20
          相关资源
          最近更新 更多