限制好友功能
restriction on friend function
根据我引用的文本( Herbert Schildt的完整参考),派生类不继承友元函数,友元函数可能没有存储类说明符。也就是说,它们不能声明为静态或外部。为什么?
派生类不继承友元函数?[…]为什么?
因为这会破坏封装:派生类不能再控制它的友类,所以它不能有效地控制谁可以访问它的内部。
不能声明为static或extern,为什么?
static
将没有意义(它只在属于一个类的函数中有意义,而friend
是自由函数),并且extern
将再次违反封装,因为类不再有效地控制哪个函数可以访问它;由于extern
,朋友可以有效地来自不同的编译单元,而该类不知道。- Inherit类不继承友元函数,因为这样做没有意义:
- friend函数本身知道它是哪个类的朋友,但它不会神奇地了解一个新的子类,所以它也不需要成为它的朋友。
- 由于向父类的隐式转换,仍然可以在派生类上使用该函数。
- 友元声明不能包含
static
和extern
,因为它不是函数签名的一部分,所以不需要指定函数。我相信函数本身的声明可以(在类之外)包含这两种。
相关文章:
- 有没有可能有一个只有ADL才能找到的非好友功能
- 解析模板的好友功能时出现问题
- 特定好友功能专业化
- 好友功能 - 成员无法访问
- 无法从好友功能访问类的私有成员?"ostream"不是"std"的成员?
- 好友功能仍无法访问私人会员
- CUDA C++中的好友功能
- 我无法获得好友会员功能以实际访问私人会员
- 好友功能没有访问私人成员
- 我无法正确使用好友功能
- 如何更恰当地处理好友功能
- 为什么我的好友功能无法访问私人会员?
- 好友功能和受保护的数据
- 选择何时使用好友功能
- 好友功能"non-lvalue in assignment"
- 好友功能无法访问私人数据成员
- 在C++中使用好友功能有什么额外的优势?
- 成员无法使用好友功能访问
- 即使将会员功能设为好友也无法访问会员
- 好友功能 - 无法访问私人字段C++