来看看这些类:
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是Base类的受保护成员,这应该已经可以让Sneaky访问,你能解释一下我哪里错了或者更详细地阐述一下吗?