为什么仅当使用公共继承时,“朋友功能”才可用于派生类?

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

[derived class通过base class访问继承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;
}
c++ class inheritance friend friend-function
1个回答
2
投票

如上面答案中已经指出的,友谊不是继承的。因此,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.