views:

78

answers:

4

Hi,

If a class Derived is inherited privately from a class Base and the Derived class has a friend function f(), so what members can f() access from Derived class and Base class.

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;
};

I understand that if a class is inherited privately from the base class, everything is private in the derived class.

But why in the code above, the function f() can access a, b, d, e, f but not c?

+2  A: 

Private members are not accessible in derived classes.

Anon.
+4  A: 

A friend of Derived can access exactly what Derived itself can - that is, any member of Derived, and any public or protected member of any base class, or of any public or protected grand-parent class, but not any private members of base classes, or members of private grand-parent classes.

Mike Seymour
+4  A: 

'Friendship' grants access to the class that declares the friend - it's not transitive. To use a bad analogy - my friends are not necessarily my dad's friends.

The C++ FAQ has a bit more detail:

Michael Burr
+1 for the analogy.
Anon.
The analogy in this case would be closer to: 'granting access to my friends into my house will not grant them access to my father's safeguard that I cannot open myself'
David Rodríguez - dribeas
@dribeas: Yes - your analogy is closer to the C++ behavior.
Michael Burr
+2  A: 

The friend function has access to all members of Derived. It doesn't have access to any members of Base that Derived can't access. Derived can't access Base::c because Base::c is private.

Liz Albin