在C+中传承友谊+;? 因为C++中没有继承类友谊,“假”的最好方法是什么?

在C+中传承友谊+;? 因为C++中没有继承类友谊,“假”的最好方法是什么?,c++,inheritance,friend-class,C++,Inheritance,Friend Class,我曾考虑通过待继承基类中的受保护方法公开friend类的私有接口,但这会导致必须编写(和维护)同一接口两次 还有其他方法吗?使用键是一种可能的解决方案 其思想是,只有当您拥有钥匙时,才能解锁操作。。。但一个例子胜过千言万语,所以让我们开始: // Step 1: The key class NeedAccess; namespace details { class Key { friend NeedAccess; Key() {} }; } // Step 2: NeedAccess cla

我曾考虑通过待继承基类中的受保护方法公开friend类的私有接口,但这会导致必须编写(和维护)同一接口两次


还有其他方法吗?

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

其思想是,只有当您拥有钥匙时,才能解锁操作。。。但一个例子胜过千言万语,所以让我们开始:

// 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);
};
密钥可复制构造的问题有待讨论。我看不出你能通过阻止它得到什么

另一个好处是,您可以拥有多个密钥,这取决于您想要访问的方法,这样您可以授予“部分”友谊,并且您的“部分”朋友不能乱动您的私人部件,尽管有著名的声明

编辑

这种方法被称为有限友谊,并在上进行了讨论


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

不确定这是否不是您已经想到的,但这里有一个示例,frinedship类的子类需要请求父类为其执行访问

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
     }
};

由于
Key
是一个空类,它实际上是否有任何堆栈wize/内存wize效果,或者编译器是否仅将其视为“语法糖”?空类仍然“重”一些东西(至少一个字节的数据,通常更严重的对齐问题)。有一种称为空基优化的优化,它包括从空类继承以避免产生这种开销。因此,您可以选择让
NeedAccess
Key
私下继承,并返回引用而不是副本。。。但引用也“衡量”了一些东西。