为什么将Parent类定义为友元类?

时间:2013-11-05 09:19:08

标签: c++

我正在查看其他代码并找到一个我无法理解的部分。

class a {
   public:
   function xxx () {.....}
}

class b : public a {
   public:
       xxxx
   protected:
       constructor()....

       friend class a ;            <=  here why it is needed ????

}

据我了解,由于b已经从a继承,它应该能够直接使用a的功能。这个“朋友”声明用于什么目的?

5 个答案:

答案 0 :(得分:1)

friend允许a使用b的方法,而不是相反,这不是隐含的。

虽然设计看起来很可疑,但基类不应该关心派生类。

答案 1 :(得分:0)

friend class a;授予班级a访问b非公开成员的权利。因此,在这个小例子中,a的实例可以调用b::constructor()。没有友谊,就不可能。

至于为什么,没有足够的信息来回答这个问题,除了必须要a调用b::constructor()的实例(假设除了语法错误之外的其他内容)目前是)。

答案 2 :(得分:0)

  

据我了解,由于b已经从a继承,它应该能够直接使用a的功能。

是。友情规范虽然允许相反的访问(a的实例将能够访问b的私人数据和功能。

  

这个“朋友”声明用于什么目的?

上面的例子没有提出任何建议。可能有意义的唯一情况是在某些情况下使用CRTP(即a的{​​{1}}模板),但即便如此,如果您看到这样的要求(“必须在b中添加朋友声明”) “)你所看到的设计有可能存在缺陷。

你能发表一个具体的例子吗?

答案 3 :(得分:0)

根据您的项目/要求,您的班级设计会发生变化。我没有评论你的班级等级,但你的问题是关于朋友使用的理论。如果你不使用朋友,你将无法从A调用B成员。这是...交叉交配:D

答案 4 :(得分:0)

几乎可以肯定,这意味着存在严重的设计问题。继承的基本经验法则之一是基类不需要任何有关派生类的信息。让a成为b的朋友可以使a的成员函数获得b个对象的内部。