这是我正在尝试做的事情:
class A
{
friend class C (and all of C's derived classes)
public:
void DoAThing() { mpMyC->DelegateResponsibility(myB); }
private:
class B
{
};
B mMyB;
C* mpMyC;
};
class C
{
// No problem here- C can see B
virtual void DelegateResponsibility(const A::B& necessaryInfo);
};
class D: public C
{
// Uh-oh- we don't inherit friendship
virtual void DelegateResonsibility(const A::B& necessaryInfo);
};
简而言之,我在A中有一个私有嵌套类,因为它是A的实现细节。但是,我想将A的一些职责委托给C和C的派生类来获得一些多态行为。我希望每次有人从C派生时都不必添加朋友类行。为派生的朋友类提供的标准解决方法是“只需向基类添加受保护的访问器函数并为派生成员覆盖它”,但仅限于帮助访问A类的私有成员,而不是私有作用域。有没有办法解决这个问题?
答案 0 :(得分:1)
这应该有效:
class C
{
typedef A::B MyB;
virtual void DelegateResponsibility(const MyB& necessaryInfo);
};
class D: public C
{
// Uh-oh- we don't inherit friendship
virtual void DelegateResonsibility(const MyB& necessaryInfo);
};
答案 1 :(得分:0)
您可以将B类放在详细命名空间中,文件范围。
类似的东西:
namespace my_hidden_area {
class B {
...
}
}
当然,它并不像使类嵌套为私有一样强大,但它应该向外界明确表示他们不应该乱搞B。
如果您想知道为什么友谊不可继承,请参阅此问题:Why does C++ not allow inherited friendship?