来自C ++入门第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是Base Class的受保护成员,它本应该已经访问Sneaky,你能解释为什么我错了或者更详细一些请?
答案 0 :(得分:2)
我的理解告诉我它无论如何都应该工作,因为s 派生自Base,prot_mem是Base Class的受保护成员, 本应该可以访问Sneaky
不,受保护的变量prot_mem
只能由派生类成员访问,但不能由第三方类成员访问,如class Pal
,如果Pal
不是{{1}的朋友}}
答案 1 :(得分:1)
没有友谊,Pal
只会看到Sneaky或Base的公众成员。 Base
的一名成员受到保护这一事实不会以任何方式使Pal
受益 - 只会使Sneaky
受益。
答案 2 :(得分:1)
问题是虽然Sneaky
可以访问prot_mem
,但您展示的代码不在Sneaky
中,而在Pal
中。如果Pal
是不相关的类,则无法访问prot_mem
,Sneaky
也受Pal
保护。但是,Base
是{{1}}的朋友,可以为其提供必要的访问权限。