我有以下查询;
classB inherits from classA
classC is friend of classB
这是否意味着 classC 应该能够访问 classA 的受保护成员?既然classB从classA继承了这个,那么classC可以访问classB中的所有东西吗?
我有以下查询;
classB inherits from classA
classC is friend of classB
这是否意味着 classC 应该能够访问 classA 的受保护成员?既然classB从classA继承了这个,那么classC可以访问classB中的所有东西吗?
[我原来的回答是胡说八道。对此表示歉意。感谢@celtschk 指出这一点并提供更好的答案。]
如果C
是 的朋友B
,它可以访问 的所有B
成员,无论是私有的、公共的还是受保护的,并且包括作为基础子对象一部分的可访问(公共和受保护)成员:
struct A { protected: int a; };
struct B : A { private: int b; friend struct C; }
struct C
{
B x;
A w;
void f()
{
x.a = 1; // fine
x.b = 2; // fine
// w.a = 0; /* Error, #1 */
}
friend struct D; // see below
};
然而,友谊既不是传递的也不是继承的:C
是 的朋友B
,但不是A
(见#1)的朋友。此外,如果D
是 的朋友C
,则D
无法获得C
的友谊B
提供的任何访问权限,因此D
无法访问B
的非公共成员。同样,如果struct E : C
继承自C
,则 thenE
也不是B
自动的朋友:
struct D
{
B y;
void g()
{
// y.b = 3; /* Error! */
}
};
struct E : C
{
B z;
void h()
{
// y.b = 4; /* Error! */
}
}
或许可以从以下几点总结发生的事情:
派生类可以访问每个基类的所有公共和受保护成员。
一个类的朋友可以访问该类的所有可访问的成员(即除私有基成员之外的所有成员)。
友谊不是继承的:如果一个类有一个朋友,那么这种友谊不适用于它的任何基类,也不适用于它的任何派生类。
朋友的朋友不是朋友。
这意味着classC
应该能够访问受保护的classA
子对象部分classB
。它不应该能够从自己访问任何非公开的东西classA
。
例如:
class C;
class A
{
protected:
int i;
};
class B:
public A
{
friend class C;
};
class C
{
public:
void foo(A& a, B& b)
{
// a.i = 3; // not allowed
b.i = 3; // allowed, accesses the `i` of the `A` subobject of `B`
}
};