阶级友谊 - 一个难题

Prz*_*m3k 9 c++ inheritance class access-control friend

我是初学者级别的面向对象编程爱好者.我遇到了以下谜题:

class A { 
}; 

class B { 
protected: 
    friend class A; 
};

class C { 
public: 
    friend class B; 
};
Run Code Online (Sandbox Code Playgroud)

参考上面的示例代码,假设上面的类有数据成员,可以在A成员的声明中使用C成员的名称?

  1. 只有私人会员

  2. 只受保护的成员

  3. 所有C的数据成员

  4. 只有公众成员

  5. C的数据成员中没有一个*

我的选择是回答4,因为友谊不是传递性的.因此,A是B的朋友,但A不是C的朋友(即使B是C的朋友).这是正确的想法吗?

另外,我的问题是到目前为止(在教程中)我遇到过exmaples,其中友谊声明如下:

class X { 
public: 
    friend class Y;
};
Run Code Online (Sandbox Code Playgroud)

如果我们使用受保护的那个而不是公共说明符,有什么区别?像那样:

class X { 
protected: 
    friend class Y; 
};
Run Code Online (Sandbox Code Playgroud)

Alo*_*ave 7

  1. 你是对的.友谊不是传递性的,也不是遗传的.
  2. friend声明的访问说明符下,它没有任何区别.

只要班级A本身不被宣布为班级的朋友C.您不能访问的任何保护或私有成员CA.