Если Полученный класс наследован конфиденциально от класса Основа, и Производный класс сделал, чтобы друг функционировал f (), поэтому какие участники могут 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;
};
Я понимаю, что, если класс наследован конфиденциально от базового класса, все является частным в производном классе.
Но почему в коде выше, функция f () может получить доступ к a, b, d, e, f, но не c?
'Дружба' предоставляет доступ к классу, который объявляет друга - это не переходное состояние. Использовать плохую аналогию - мои друзья не обязательно друзья моего отца.
В C++ FAQ есть немного больше деталей:
Функция друга имеет доступ ко всем членам , полученных . Это не имеет доступа к любым членам базы , что получено не может получить доступ. Полученные не могут получить доступ База :: C Поскольку База :: C является частным.
Друг Производный
может получить доступ именно к тому, что Производный
может получить сам - то есть любой член Производный
, и любой общественный или охраняемый член любого базового класса, или любой общественный или охраняемый класс дедушек и бабушек, но не ни один частный член базового класса, или член частного класса дедушек и бабушек.