[当派生类通过公共访问从基类继承时,问题与Are friend functions inherited? and why would a base class FRIEND function work on a derived class object?中的问题相同。但是,如果它是通过受保护或私有访问继承的,则将出现可见性错误。
[当通过公共访问继承时,A的私有成员的可访问性与通过私有访问继承的相同。它们之间有什么区别?
class A {
private:
int a;
friend void f();
};
class B : private A {
};
void f() {
B obj;
int x = obj.a;
}
int main() {
f();
return 0;
}
如上面答案中已经指出的,友谊不是继承的。因此,A
的朋友也不是B
的朋友。通过访问B
从A
继承private
意味着A
的所有成员都可以作为B
[class.access.base]/1的私有成员进行访问。由于f
不是B
的朋友,所以它无法访问B
[class.access]/1.1的私人成员。由于f
不是B
的朋友,因此A
的基类B
也无法从f
[class.access.base]/4访问。由于无法从A
访问B
的基类f
,因此也无法访问A
中B
的f
子对象(可以访问其成员)。 [class.access.base]/5…