为什么朋友的功能不能访问继承类的私有变量?

时间:2018-03-08 21:19:09

标签: c++ class oop

friend函数是否应该访问Base类和Derived类中的所有内容? class Derived: public Base - > private Base中的所有内容现在都是派生类中的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);
}

2 个答案:

答案 0 :(得分:2)

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

C ++中有两种类型的继承

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

上面提到的所有内容都适用于上述情况。即使您将基础B类作为公共类别吸引到Derieve类D,所有私人成员也会将D作为受保护的私人受保护成员,并将其公开为公共。

但是如果你像下面那样私有地使用,那么Base类的所有成员现在都将成为Derieve类的私有成员。

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

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

答案 1 :(得分:1)

  

friend函数是否应该访问Base类和Derived类中的所有内容?

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

  

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

没有。之前privateBase的所有内容仍为private

使用public / protected / private进行继承means something different,而不是成员访问控制。