为什么要将父类定义为友元类

Why define Parent class as friend class?

本文关键字:友元 定义 父类 为什么      更新时间:2023-10-16

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

class a {
   public:
   function xxx () {.....}
}
class b : public a {
   public:
       xxxx
   protected:
       constructor()....
       friend class a ;            <=  here why it is needed ????
}

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

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

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

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

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

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

是的。友元规范虽然允许以相反的方式访问(a的实例将能够访问b的私有数据和功能)。

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

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

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

根据您的项目/要求,您的类设计会发生变化。我对你的阶级等级制度没有评论,但你的问题确实是关于朋友使用的理论。 如果您不使用好友,您将无法从 A 呼叫 B 成员。它在那里...交叉配接:D

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

相关文章: