从单独的类访问受保护的成员

时间:2014-05-03 04:49:44

标签: c++

这是对我正在使用的内容的过度简化,因为有很多代码。所以我有两节课。 A是Aa的父级,X是Xx的父级。我将父A设置为X和Xx的友元类,以便我可以访问其私有和受保护的变量。现在因为Aa是A的孩子并且继承自A,为什么我无法访问X或Xx的受保护成员? A是朋友班,所以不应该这样做吗?我总是得到一个错误,说barA是X的受保护成员。

class A {
    friend class X;
    friend class Xx;
public:
    void FooA();
protected:
    int fooA;
};

class Aa: public A {
public:
    voif Fooa();
private:
    int fooa;
};

class X {
public:
    void BarA();
protected:
    int barA;
};

class Xx: public X {
public:
    void Bara();
private:
    int bara;
};

3 个答案:

答案 0 :(得分:3)

当你写friend class X;friend class Xx;时,它意味着X和Xx的成员函数可以访问A类的私有和受保护成员。看起来你想要反过来。为此,您应该在X和Xx中添加friend class Aa

答案 1 :(得分:0)

友谊不是继承和单向的。您还必须将子类设为friend

此外,在您当前的声明中,X可以访问A的私人成员,但反之亦然。

正如另一个答案所说,您需要将friend class Aa;添加到课程X。 如果您希望A也可以访问X的成员,那么您还需要将friend class A;添加到X

答案 2 :(得分:0)

你说,

  

我将父A设置为X和Xx的友元类,以便我可以访问其私有和受保护的变量。

这是对friend对类的作用的错误理解。进行人工比较以更好地理解它。

说你相信你的朋友约翰。你给他房子的钥匙。约翰随心所欲地进出你的房子。你让约翰成为了朋友"。但是,这并不能让你进入约翰的家。约翰没有把钥匙交给你。他并没有授予你给予他的朋友的权利。

在您的情况下,A已授予friend - 发送至XXxXXx可以轻松访问A的私有部分。这不会A访问XXx的私有部分。只有XXx可以通过声明<{p}}来发送friend -

friend class A;

在类定义中。