【发布时间】: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