为什么友元函数无法访问继承类的私有变量?

Why can't a friend function access the private variables of an inherited class?

本文关键字:变量 继承 函数 友元 访问 为什么      更新时间:2023-10-16

friend函数不是应该访问Base类和Derived类中的所有内容吗?class Derived: public Base->Baseprivate的所有内容现在都public派生的类中。

class Base
{
private:
int x;
};
class Derived : public Base
{
int y;
public:
void SetY(int value);
void friend SetX(Derived &d);
};
void SetX(Derived &d)
{
d.x = 100; // Why is this a problem?
// Isn't Base supposed to be public now that is inherited?
}
int main()
{
Derived d;
SetX(d);
}

Derived类的友元函数void friend SetX(Derived &d);只是该类的友元函数,它只能访问Derived类的私有成员,但不允许访问基类的任何私有或受保护成员。此外,即使从 Derieve 类中,您也无法访问基类的私有成员,而只能访问公共成员和受保护成员。要访问/访问基类的私有成员,您必须使用基类的公共成员函数。

C++有两种类型的继承

class B{};
class D:public B{};

我上面提到的所有内容都适用于上述情况。即使你B阶级作为公共的Derieve类D所有私人成员inharite到DerieveD作为私人,受保护的成员作为受保护和公共的

。但是,如果你像下面这样私有,那么基础类的所有成员现在都将是Derieve类的私有。

class B{};
class D:private B{};

在这种情况下,友元函数甚至无法访问基类B的任何成员。

friend函数不是应该访问类和类BaseDerived中的所有内容吗?

不。它是Derived的朋友,所以它应该访问Derived类可以访问的所有内容。

class Derived: public Base->Baseprivate中的所有内容现在都public派生的类中。

不。以前在Baseprivate的一切,现在仍然是private.

使用public/protected/private进行继承意味着与成员访问控制不同。