我是初学者的面向对象编程爱好者。我遇到了以下难题:

class A {
};

class B {
protected:
    friend class A;
};

class C {
public:
    friend class B;
};

引用上面的示例代码,假设上述类具有数据成员,那么在A成员的声明中可以使用C成员的名称是什么?
  • 只有私有(private)成员
  • 仅 protected 成员
  • C的所有数据成员
  • 仅公共(public)成员
  • C的数据成员中没有一个*

  • 我的选择是答案4,因为友元不是传递性的。因此,A是B的 friend ,但A不是C的 friend (即使B是C的 friend )。
    那是正确的想法吗?

    另外,我的问题是,到目前为止(在本教程中)我遇到过这样的例子,其中以这样的方式声明了友元:
    class X {
    public:
        friend class Y;
    };
    

    如果我们使用 protected 者而不是公共(public)说明者有什么区别?像那样:
    class X {
    protected:
        friend class Y;
    };
    

    最佳答案

  • 你是正确的。友元不是传递性的,也不是继承性的。
  • 在您放置friend声明的访问说明符下没有任何区别。

  • 只要没有将A类本身声明为C类的 friend 。您无法在C中访问A的任何 protected 或私有(private)成员。

    关于c++ - 类(class)友元-一个难题,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14378971/

    10-10 09:13