【发布时间】:2009-11-05 15:36:35
【问题描述】:
既然 C++ 中没有继承阶级友谊,那么“伪造”它的最佳方法是什么?
我正在考虑通过要继承的基类中的受保护方法公开朋友类的私有接口,但这导致必须编写(和维护)两次相同的接口。
还有其他方法吗?
【问题讨论】:
标签: c++ inheritance friend-class
既然 C++ 中没有继承阶级友谊,那么“伪造”它的最佳方法是什么?
我正在考虑通过要继承的基类中的受保护方法公开朋友类的私有接口,但这导致必须编写(和维护)两次相同的接口。
还有其他方法吗?
【问题讨论】:
标签: c++ inheritance friend-class
使用键是一种可能的解决方案。
这个想法是,只有拥有 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 效果,还是编译器仅将其视为“语法糖”?
NeedAccess 从Key 私下继承并返回引用而不是副本……但引用也“有分量”。
有友谊的班级的孩子需要请那里的父母为他们做访问。
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
}
};
【讨论】:
不确定这是否不是您已经在考虑的,但这里有一个 Virtual Friend 示例
【讨论】: