繁体   English   中英

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

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

不是friend函数应该访问Base类和Derived类中的所有内容吗? class Derived: public Base - >一切,是在privateBase是现在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);
}

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

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

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

我在上面提到的所有内容都适用于上述情况。 即使你inharite基B类作为公众一个Derieve类D所有的私有成员inharites到Derieve D为私有,保护成员的保护,公众公开。

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

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

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

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

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

class Derived: public Base - >一切,是在privateBase是现在public派生的类里面。

不。之前在Base private Base仍然是private

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM