为什么友元函数仅在使用公共继承时才对派生类“可用”?

JM2*_*333 5 c++ inheritance class friend friend-function

当派生类通过公共访问从基类继承时,问题与友元函数是否被继承?为什么基类 FRIEND 函数可以在派生类对象上工作?。但是,如果它通过受保护或私有访问继承,则会出现可见性错误。

当它通过公共访问继承时,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;
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*zel 7

正如上面链接的答案中已经指出的,友谊不是继承的。因此, 的朋友A并不也是 的朋友BBAvia access继承private意味着 的所有成员都可以作为[class.access.base]/1A的私有成员进行访问。由于不是 的友元,因此它无法访问[class.access]/1.1的私有成员。由于不是 的友元,因此也无法从[class.access.base]/4访问的基类。由于的基类无法从 访问,因此您也无法在[class.access.base]/5中访问a 的子对象(您可以访问其中的成员)...B fBB fBABf ABfABf