限制好友功能

restriction on friend function

本文关键字:功能 好友      更新时间:2023-10-16

根据我引用的文本( Herbert Schildt的完整参考),派生类不继承友元函数,友元函数可能没有存储类说明符。也就是说,它们不能声明为静态或外部。为什么?

派生类不继承友元函数?[…]为什么?

因为这会破坏封装:派生类不能再控制它的友类,所以它不能有效地控制谁可以访问它的内部。

不能声明为static或extern,为什么?

因为static将没有意义(它只在属于一个类的函数中有意义,而friend是自由函数),并且extern将再次违反封装,因为类不再有效地控制哪个函数可以访问它;由于extern,朋友可以有效地来自不同的编译单元,而该类不知道。
  1. Inherit类不继承友元函数,因为这样做没有意义:
    1. friend函数本身知道它是哪个类的朋友,但它不会神奇地了解一个新的子类,所以它也不需要成为它的朋友。
    2. 由于向父类的隐式转换,仍然可以在派生类上使用该函数。
  2. 友元声明不能包含staticextern,因为它不是函数签名的一部分,所以不需要指定函数。我相信函数本身的声明可以(在类之外)包含这两种。