[derived class
通过base class
访问继承public
时,问题与Are friend functions inherited? and why would a base class FRIEND function work on a derived class object?中的问题相同。但是,如果它通过protected/private
访问进行继承,则可见性将出错。
[通过public
访问继承时,A的private
成员的可访问性与private
访问的继承相同,它们之间的区别是什么?
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…