为什么只有在使用公共继承时,朋友函数才可用于派生类?

问题描述 投票:4回答:1

[当派生类通过公共访问从基类继承时,问题与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++ class inheritance friend friend-function
1个回答
3
投票

如上面答案中已经指出的,友谊不是继承的。因此,A的朋友也不是B的朋友。通过访问BA继承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,因此也无法访问ABf子对象(可以访问其成员)。 [class.access.base]/5

© www.soinside.com 2019 - 2024. All rights reserved.