3

来自 C++ Primer 5th edition:
看看这些类:

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

4

3 回答 3

2

我的理解告诉我它应该可以工作,因为 s 派生自 Base 而 prot_mem 是 Base Class 的受保护成员,它应该已经可以访问 Sneaky

不,受保护的变量prot_mem只能由派生类成员访问,而不能由第三方类成员访问,例如class Pal,如果Pal不是 的朋友Base

于 2013-09-09T14:02:47.073 回答
1

没有友谊,Pal只能看到 Sneaky 或 Base 的公众成员。一个成员受到保护这一事实Base不会Pal以任何方式受益——它只会受益Sneaky

于 2013-09-09T14:00:03.797 回答
1

问题是虽然Sneaky可以访问prot_mem,但您显示的代码不在Sneaky,而是在Pal. 如果Pal是一个不相关的类,它就不能访问prot_mem,它也在Sneaky. 但是,Pal是 的朋友Base,这为其提供了必要的访问权限。

于 2013-09-09T14:00:28.937 回答