对朋友功能的限制

har*_*ris 4 c++ friend

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

Kon*_*lph 8

派生类不继承朋友函数?[...]为什么?

因为这会打破封装:派生类无法再控制其朋友,所以它实际上无法控制谁有权访问其内部.

他们可能不会被宣布为静态或外部,为什么?

因为static没有意义(它只在属于类的函数中有意义,并且friends是自由函数),并且extern会再次违反封装,因为类实际上无法再控制哪个函数可以访问它:由于存在extern,朋友可以有效地来自一个不同的编译单元,这个单元是未知的.

请参阅Jan的答案进行更正.

  • 对不起,这个答案的第二部分是完全错误的.`static`对于自由函数有意义(使它们在编译单元中是本地的),并且每个不包含关键字`static`的自由函数声明都隐含地包含`extern`.类也与编译单元无关.朋友可以有效地来自*任何*编译单元,无论它的"不同"都无法定义. (2认同)

Jan*_*dec 5

  1. 继承类不继承Fried函数,因为有一点是这样的:
    1. 朋友函数本身知道它的朋友的类,但它不会神奇地了解一个新的子类,所以它也不需要是它的朋友.
    2. 由于隐式转换为父类,仍然可以在派生类上使用该函数.
  2. friend声明不能包含static也不是extern,因为它不是函数签名的一部分,因此它并不需要指定函数.我相信函数本身的声明可以(在类之外)包含.