我正在查看其他代码并找到一个我无法理解的部分。
class a {
public:
function xxx () {.....}
}
class b : public a {
public:
xxxx
protected:
constructor()....
friend class a ; <= here why it is needed ????
}
据我了解,由于b已经从a继承,它应该能够直接使用a的功能。这个“朋友”声明用于什么目的?
答案 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
个对象的内部。