Skip to main content
 首页 » 编程设计

c++之为什么只有在使用公共(public)继承时派生类的友元函数为 "available"

2025年05月04日51jpfss

当派生类通过公共(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 , 基类 AB也无法从 f 访问[class.access.base]/4 .由于基类AB无法从 f 访问,您也无法访问 A B 的子对象(您可以访问其中的成员)在 f [class.access.base]/5