C ++允许朋友的派生类访问私有嵌套类

时间:2014-05-01 20:41:09

标签: c++ inheritance polymorphism friend delegation

这是我正在尝试做的事情:

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类的私有成员,而不是私有作用域。有没有办法解决这个问题?

2 个答案:

答案 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?