这是对我正在使用的内容的过度简化,因为有很多代码。所以我有两节课。 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;
};
答案 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
- 发送至X
和Xx
。 X
和Xx
可以轻松访问A
的私有部分。这不会A
访问X
和Xx
的私有部分。只有X
和Xx
可以通过声明<{p}}来发送friend
-
friend class A;
在类定义中。