【问题标题】:C++ allow derived classes of friend to have access to private nested classC++ 允许朋友的派生类访问私有嵌套类
【发布时间】:2014-06-18 10:26:26
【问题描述】:

这就是我想要做的:

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

【问题讨论】:

    标签: c++ inheritance polymorphism friend delegation


    【解决方案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);
    };
    

    【讨论】:

    • 这不会完全按照您编写的方式工作:默认情况下,MyB 将是 C 的私​​有成员。
    【解决方案2】:

    您可以将您的 B 类放在文件范围内的详细命名空间中。

    类似这样的:

    namespace my_hidden_area {
        class B {
            ...
        }
    }
    

    当然,它不像将嵌套的类设为私有那样提供强大的保护,但它应该让外人清楚他们不应该与 B 混在一起。

    如果你想知道为什么友谊是不可继承的,请看这个问题:Why does C++ not allow inherited friendship?

    【讨论】:

      猜你喜欢
      • 2015-03-06
      • 2021-12-30
      • 1970-01-01
      • 2013-04-09
      • 2011-12-11
      • 1970-01-01
      • 1970-01-01
      • 2021-08-16
      • 2018-08-23
      相关资源
      最近更新 更多