在C+中传承友谊+;? 因为C++中没有继承类友谊,“假”的最好方法是什么?
我曾考虑通过待继承基类中的受保护方法公开friend类的私有接口,但这会导致必须编写(和维护)同一接口两次在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
还有其他方法吗?使用键是一种可能的解决方案 其思想是,只有当您拥有钥匙时,才能解锁操作。。。但一个例子胜过千言万语,所以让我们开始:
// 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
私下继承,并返回引用而不是副本。。。但引用也“衡量”了一些东西。