在C++中继承友谊?

sol*_*old 7 c++ inheritance friend-class

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

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

还有其他方法吗?

Mat*_* M. 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);
};
Run Code Online (Sandbox Code Playgroud)

关键是可复制构建的问题需要讨论.我没有看到你可以通过阻止它获得什么.

另一个好处是你可以拥有几个键,这取决于你想要访问的方法,这样你就可以获得"部分"友谊,而你的"部分"朋友不会乱用你的私人部分,尽管有着名的声明!

编辑:

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

私有接口相比,此方法的主要优点是松散耦合,因为只需要前向声明.

  • 一个空类仍然"称重"某些东西(至少一个字节的数据,通常更多是由于对齐问题).有一个名为Empty Base Optimization的优化,它包括从空类继承以避免产生这种开销.因此,您可以选择让`NeedAccess`从`Key`私下继承并返回引用而不是副本......但是引用也会'重'某事. (2认同)