функция друга в производном классе с частным наследованием - PullRequest
7 голосов
/ 27 января 2010

Если класс Derived унаследован в частном порядке от класса Base, и класс Derived имеет функцию-друга f (), так что члены могут получить доступ к 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, но не к?

Ответы [ 4 ]

9 голосов
/ 27 января 2010

«Дружба» предоставляет доступ к классу, который объявляет друга - он не переходный. Если использовать плохую аналогию - мои друзья не обязательно являются друзьями моего отца.

FAQ по C ++ содержит немного больше деталей:

6 голосов
/ 27 января 2010

Друг Derived может получить доступ именно к тому, что может сам Derived, то есть к любому члену Derived, а также к любому общедоступному или защищенному члену любого базового класса или к любому общедоступному или защищенному классу прародителя. , но не какие-либо частные члены базовых классов или члены частных классов прародителей.

2 голосов
/ 27 января 2010

Функция друга имеет доступ ко всем членам Производная . Он не имеет доступа ни к каким членам Base , к которым Derived не может получить доступ. Производное не может получить доступ к Base :: c , потому что Base :: c является приватным.

2 голосов
/ 27 января 2010

Закрытые члены не доступны в производных классах.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...