在C ++中了解继承/友元类的成员访问

时间:2013-09-09 13:55:02

标签: c++ inheritance friend-class

来自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,你能解释为什么我错了或者更详细一些请?

3 个答案:

答案 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_memSneaky也受Pal保护。但是,Base是{{1}}的朋友,可以为其提供必要的访问权限。