具有私有继承的派生类中的friend函数

sky*_*oor 7 c++ inheritance

如果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;
};
Run Code Online (Sandbox Code Playgroud)

我理解如果一个类是从基类私下继承的,那么派生类中的所有东西都是私有的.

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

Mic*_*urr 9

'Friendship'授予访问声明朋友的类的权限 - 它不是传递的.使用一个坏的比喻 - 我的朋友不一定是我爸爸的朋友.

C++ FAQ有一些更详细的信息:

  • 这种情况下的类比更接近于:“允许我的朋友进入我的房子并不会让他们进入我父亲的保护措施,而我自己无法打开” (2认同)

Mik*_*our 6

一个朋友Derived可以准确地访问Derived它本身可以 - 也就是说,任何基类的任何成员Derived,任何公共或受保护成员,或任何公共或受保护的祖父类,但不能访问基类的任何私有成员或成员私人祖父母班.