对朋友功能的限制

时间:2011-07-20 11:25:20

标签: c++ friend

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

2 个答案:

答案 0 :(得分:8)

  

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

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

  

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

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

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

答案 1 :(得分:5)

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