Общие сведения о доступе к члену с помощью класса наследования / друга в Stack Overflow

из учебника по С ++ 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, можете ли вы объяснить, почему я не прав, или какую-то дополнительную разработку? пожалуйста?

3

Решение

мое понимание говорит мне, что это должно работать в любом случае, потому что
происходит от Base, а prot_mem является защищенным членом Base Class,
который должен был уже иметь доступ к Sneaky

Нет, защищенная переменная prot_mem доступ к нему может получить только член производного класса, но не член стороннего класса, например class Pal, если Pal не друг Base,

2

Другие решения

Без дружбы, Pal видит только публичных членов Sneaky или Base. Тот факт, что один член Base защищен, не приносит пользы Pal никак — это только польза Sneaky,

1

Дело в том, что пока Sneaky может получить доступ prot_memкод, который вы показываете, не находится в Sneaky, Оно в Pal, Если Pal был не связанный класс, он не мог получить доступ prot_mem, который также защищен в Sneaky, Тем не мение, Pal друг Base, что дает ему необходимый доступ.

1
По вопросам рекламы [email protected]