из учебника по С ++ 5-е издание:
взгляните на эти классы:
class Base {
friend class Pal;
public:
void pub_mem();
protected:
int prot_mem;
private:
int priv_mem;
};
class Sneaky : public Base {
private:
int j;
};
class Pal {
public:
int f1(Base b){
return b.prot_mem; //OK, Pal is friend class
}
int f2(Sneaky s){
return s.j; //error: Pal not friend, j is private
}
int f3(Sneaky s){
return s.prot_mem; //ok Pal is friend
}
}
Здесь Pal — друг класса Base, а Sneaky наследуется от Base и используется в Pal.
Теперь самая последняя строка, где s.prot_mem
вызывается, автор приводит причину, по которой это работает, потому что Pal — друг класса Base. Но то, что я прочитал до сих пор, мое понимание подсказывает мне, что оно должно работать в любом случае, потому что s происходит от Base, а prot_mem является защищенным членом базового класса, который уже должен иметь доступ к Sneaky, можете ли вы объяснить, почему я не прав, или какую-то дополнительную разработку? пожалуйста?
мое понимание говорит мне, что это должно работать в любом случае, потому что
происходит от Base, а prot_mem является защищенным членом Base Class,
который должен был уже иметь доступ к Sneaky
Нет, защищенная переменная prot_mem
доступ к нему может получить только член производного класса, но не член стороннего класса, например class Pal
, если Pal
не друг Base
,
Без дружбы, Pal
видит только публичных членов Sneaky или Base. Тот факт, что один член Base
защищен, не приносит пользы Pal
никак — это только польза Sneaky
,
Дело в том, что пока Sneaky
может получить доступ prot_mem
код, который вы показываете, не находится в Sneaky
, Оно в Pal
, Если Pal
был не связанный класс, он не мог получить доступ prot_mem
, который также защищен в Sneaky
, Тем не мение, Pal
друг Base
, что дает ему необходимый доступ.