当派生类通过公共(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
的 friend 也不是 B
的 friend .有B
继承自 A
通过 private
访问意味着 A
的所有成员可作为 B
的私有(private)成员访问[class.access.base]/1 .由于f
不是 B
的 friend ,它不能访问 B
的私有(private)成员[class.access]/1.1 .由于f
不是 B
的 friend , 基类 A
的 B
也无法从 f
访问[class.access.base]/4 .由于基类A
的 B
无法从 f
访问,您也无法访问 A
B
的子对象(您可以访问其中的成员)在 f
[class.access.base]/5 …