【问题标题】:Why are friend functions "available" for derived classes only when using public inheritance?为什么只有在使用公共继承时,派生类的友元函数才“可用”?
【发布时间】:2020-04-20 00:19:20
【问题描述】:

当派生类通过公共访问从基类继承时,问题与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;
}

【问题讨论】:

  • 如链接所示,C++中没有友谊继承,所以f不是B的朋友,所以f不能访问私有基类或B的成员,所以f 不能访问B::a,因为它需要访问私有基类。
  • 显然,如果您从一个类中私有派生,外部代码基本上不会看到您从该类派生。因此,鉴于外部代码看不到B 派生自A,那么您为什么期望f 能够看到这一点。当您不从某个类公开派生时,这些类之间就没有 IS-A 关系。顺便说一句,只要有可能,最好用包含来代替私有或受保护的继承。您希望尽可能避免紧耦合。

标签: c++ class inheritance friend friend-function


【解决方案1】:

正如上面链接的答案中已经指出的那样,友谊不是遗传的。因此,A 的朋友不是B 的朋友。让B 通过private 访问从A 继承意味着A 的所有成员都可以作为B [class.access.base]/1 的私有成员访问。由于f 不是B 的朋友,它不能访问B [class.access]/1.1 的私有成员。由于f 不是B 的朋友,B 的基类A 也不能从f [class.access.base]/4 访问。由于B 的基类A 无法从f 访问,因此您也无法访问B 中的A 子对象(您可以访问其中的成员)f [class.access.base]/5

【讨论】:

  • 我很困惑,当通过public访问继承时,Aprivate成员的可访问性与private访问的继承相同,它们之间有什么区别?跨度>
  • 如果ABpublic 基类,则B & 可以隐式转换为A &,因此A::a 是可访问的,因为fooA的朋友
猜你喜欢
  • 2016-10-08
  • 2011-01-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多