为什么要将父类定义为友元类
Why define Parent class as friend class?
我正在查看其他人的代码,并找到一个我无法理解的部分。
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
对象的内部。
相关文章:
- 在模板类之外定义友元函数的正确方法是什么?
- 2个模板化类的非模板友元函数未定义引用错误
- 未定义的类模板不会实例化以检查友元函数
- 在类内定义的友元函数与类外定义的友元函数的查找规则之间的差异
- 具有定义模板还是非模板的友元函数
- 为什么T是未定义的?我正在尝试实现一个用于双链表的节点类,它不喜欢我使用友元运算符后的T
- 模板和隐式构造函数的类定义之外的友元声明
- 为什么我不能定义一元运算符,然后在 MSVC 的模板类中声明具有相同名称的友元二进制运算符?
- 为什么在定义类之前声明类的对象会在友元类中给出错误,而在友元函数中不会出错
- 正确的友元定义,以授予 std::map 对私有默认构造函数的访问权限
- 如何获取指向模板类中定义的友元函数的函数指针
- 在 c++ 中定义命名空间中模板类的友元函数时出现问题
- 当类和函数具有单独的模板参数时,在类定义之外定义友元函数
- 获取内联定义的友元函数的地址
- 我可以有一个从外部不可见但未在标头中定义的静态友元函数吗?
- 如何正确定义无友元函数
- 类具有友元函数.该函数在不同的头文件中的同名 apce 中定义.它无法访问私有成员
- 如何在局部类中定义友元函数运算符>>?
- 类内定义的友元函数的调试标志中的命名空间
- 声明在早期友元定义中定义的友元函数