C++ 友元函数的限制

C++ 友元函数的限制,c++,friend,C++,Friend,根据我所指的文本(Herbert Schildt的完整引用),派生类不继承友元函数,友元函数可能没有 存储类说明符。也就是说,它们不能声明为静态或外部。为什么? 派生类不继承友元函数?[…]为什么 因为这将破坏封装:派生类无法再控制它的朋友,因此它无法有效地控制谁有权访问它的内部 它们不能声明为静态或外部,为什么 因为static没有意义(它只在属于类的函数中有意义,friends是自由函数,extern将再次违反封装,因为类不再有效地控制哪个函数可以访问它:因为是extern,这个朋友实际上可

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

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

因为这将破坏封装:派生类无法再控制它的朋友,因此它无法有效地控制谁有权访问它的内部

它们不能声明为静态或外部,为什么

因为
static
没有意义(它只在属于类的函数中有意义,
friend
s是自由函数,
extern
将再次违反封装,因为类不再有效地控制哪个函数可以访问它:因为是
extern
,这个朋友实际上可能来自不同的编译单元,这个类不知道

请参阅简的答案以获得更正

  • Inherit类不会继承友元函数,因为这样做没有意义:
  • friend函数本身知道类的朋友,但它不会神奇地了解新的子类,因此也不需要是它的朋友
  • 由于到父类的隐式转换,仍然可以在派生类上使用该函数
  • 友元声明不能包含
    static
    extern
    ,因为它不是函数签名的一部分,所以不需要指定函数。我相信函数本身的声明(在类之外)可以包含以下两种内容

  • 扔掉这本书,买一本新的。Herb Schildt的书是因为他们的技术错误。对不起,这个答案的第二部分是完全错误的<代码>静态对自由函数(使它们成为编译单元的本地函数)有意义,并且每个不包含关键字
    静态
    的自由函数声明都隐式包含
    外部
    。类也不与编译单元相关联。朋友可以有效地来自任何编译单元,无论它是否“不同”,都无法定义。