在C ++中继承友谊?

时间:2009-11-05 15:36:36

标签: c++ inheritance friend-class

由于类友谊不是在C ++中继承的,那么“伪造”它的最佳方式是什么?

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

还有其他方法吗?

3 个答案:

答案 0 :(得分:8)

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

我们的想法是,只有当您拥有密钥时才可以解锁操作......但是一个例子值得数以千计,所以让我们潜水:

// 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相比,此方法的主要优点是松耦合,因为只需要前向声明。

答案 1 :(得分: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
     }
};

答案 2 :(得分:0)

不确定这不是你已经考虑过的,但这里是一个Virtual Friend例子