在 C++ 中继承友谊?

Posted

技术标签:

【中文标题】在 C++ 中继承友谊?【英文标题】:Inheriting friendship in C++? 【发布时间】:2009-11-05 15:36:35 【问题描述】:

既然 C++ 中没有继承阶级友谊,那么“伪造”它的最佳方法是什么?

我正在考虑通过要继承的基类中的受保护方法公开朋友类的私有接口,但这导致必须编写(和维护)两次相同的接口。

还有其他方法吗?

【问题讨论】:

【参考方案1】:

使用是一种可能的解决方案。

这个想法是,只有拥有 key 才能解锁操作...但是一个例子价值数千字,所以让我们开始吧:

// Step 1: The key
class NeedAccess;

namespace details  class Key  friend NeedAccess; Key()  ; 

// Step 2: NeedAccess
class NeedAccess

protected:
  static details::Key GetKey()  return details::Key(); 
;

// Step 3: The big one
class BigOne

public:
  void lockedMethod(details::Key);
;

密钥是否可复制的问题有待讨论。我看不出你可以通过阻止它获得什么。

另一个好处是您可以拥有多个密钥,具体取决于您要访问的方法,这样您就可以授予“部分”友谊,并且您的“部分”朋友不能乱搞您的私人部分,尽管著名索赔!

编辑

这种方法称为有限友谊,并在comp.lang.c++.moderated 上进行了讨论。

与Private Interface 相比,此方法的主要优点是松散耦合,因为只需要前向声明。

【讨论】:

既然Key 是一个空类,那么它实际上是否有任何stack-wize/memory-wize 效果,还是编译器仅将其视为“语法糖”? 一个空的类仍然“称重”一些东西(至少一个字节的数据,通常更多的是由于对齐问题)。有一种称为空基优化的优化,它包括从空类继承以避免产生这种开销。因此,您可以选择让NeedAccessKey 私下继承并返回引用而不是副本……但引用也“有分量”。【参考方案2】:

有友谊的班级的孩子需要请那里的父母为他们做访问。

class CrustyNeighbour

    private:
       friend class Bob;
       void useWiFi(std::string const& data);
;

class Bob

    protected:
        useWifi(CrustyNeighbour& neighbour,std::string const& data)
          neighbour.useWiFi(data);
;

class Mary: public Bob // Bob's offspring

     void playHalo(WifiOwner& owner) // WifiOwner derived from CrustyNeighbour
     
         useWifi(owner,gameData);  // use wifi via his/her parent who access to eighbours wifi
     
;

【讨论】:

【参考方案3】:

不确定这是否不是您已经在考虑的,但这里有一个 Virtual Friend 示例

【讨论】:

以上是关于在 C++ 中继承友谊?的主要内容,如果未能解决你的问题,请参考以下文章

友谊得到继承??奇怪的

C++和Java中继承的个人感觉

C#中继承问题

如何在 JavaScript 中继承 C++ 类?

C++中继承类的构造函数

为啥在 Qt 中继承 QWidget 类时出现内存泄漏