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, 开发者_StackOverflow社区e, f but not c?
'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:
- http://www.parashift.com/c++-faq-lite/friends.html#faq-14.4
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.
Private members are not accessible in derived classes.
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.
精彩评论