0

我正在查看其他人的代码,发现有一部分我无法理解。

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

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

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

}

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

4

5 回答 5

1

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

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

于 2013-11-05T09:23:02.267 回答
0

Depending on your projects/requirements, your class designs change. I have no comment on your class hierarchy but true your question is all about theories of friend usage. If you don't use friend, you will not be able to call B members from A. It is there for...cross-mating :D

于 2013-11-05T09:59:34.730 回答
0

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

是的。朋友规范虽然允许以其他方式访问(的实例a将能够访问私有数据和函数b)。

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

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

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

于 2013-11-05T09:31:27.407 回答
0

friend class a;授予类a访问 的非公共成员的权利b。所以在这个小例子中,一个a可以调用的实例b::constructor()。没有友谊,这是不可能的。

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

于 2013-11-05T09:24:27.437 回答
0

这几乎可以肯定意味着存在严重的设计问题。继承的基本经验之一是基类不需要任何关于派生类的信息。a结交of 的朋友使b成员函数a可以了解对象的内部结构b

于 2013-11-05T13:11:11.440 回答