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

时间:2010-01-26 21:17:24

标签: c++ inheritance

如果Derived类是从类Base私下继承而Derived类有一个友元函数f(),那么成员可以从Derived类和Base类访问哪些成员。

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?

4 个答案:

答案 0 :(得分:9)

'Friendship'授予对声明朋友的类的访问权限 - 它不具有传递性。使用一个坏的比喻 - 我的朋友不一定是我父亲的朋友。

C ++ FAQ提供了更多细节:

答案 1 :(得分:6)

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

答案 2 :(得分:2)

派生类无法访问私有成员。

答案 3 :(得分:2)

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