朋友功能和cpp中的继承

时间:2016-12-13 10:24:53

标签: c++ function friend

是cpp的新手。一般来说,友元函数可以访问类的私有成员和受保护成员,但是当我尝试在派生类中使用友元函数时,我会观察到所需的行为。

class first
{
  int a;
};

class second : public first
{
  public:
   friend void hai ( second );
};

void hai ( second s )
{
 printf("%d",s.a); // It says compilation error 
}

void main()
{
  second s;
  hai(s);
}

如果我将 a设为公开 ,则可以正常使用。

有人可以清楚我,为什么我不应该在基础私人范围内访问它。

此致 Prasath S。

4 个答案:

答案 0 :(得分:0)

使字段a受保护,而不是私有。

只能从声明它们的类访问私有字段。

答案 1 :(得分:0)

您的错误在这里:

class first
{
  int a;
};

类成员的默认值是私有的,因此您无法从派生类访问它。

私人会员只能从同一个班级访问。这条线

class second : public first

不会将私有成员更改为公开,因此您可以选择将a保护/公开,还是将公共/受保护的get / set函数添加到first,这将是管理对a

的访问权限

答案 2 :(得分:0)

  

为什么我不应该在基础私有范围内访问它。

friend函数可以访问其朋友所在类的private个成员。

但是在这种情况下,基类中的成员a默认为private,因此不会继承到子类。

公共继承需要protected或子类的成员才能由子类继承。因此,为了让您的示例正常工作,您可以使用protected成员a

class first
{
    protected:
        int a;
};

答案 3 :(得分:0)

{p> first::aprivate

中为class first

class second是从class first公开派生的,所以:

  • class first的所有公开成员都在class second中公开,可以通过class second的对象进行访问。
  • class first的所有受保护成员均受class second保护,无法通过class second的对象访问。
  • class firstclass second的所有私人成员都无法访问,无法通过class second的对象访问。

因此,您无法通过first::a的对象访问class second

有关详细信息:Can a friend class object access base class private members on a derived class object?

Why can a derived class not access a protected member of its base class through a pointer to base?