无法访问多态嵌套类中包含类的成员

问题描述 投票:0回答:2

一个嵌套类Foo::Utility可以访问另一个嵌套类Foo::Container,即使后者是私有的。我试图将此访问扩展到UtilityPrint的多态版本Foo::Utility,但未成功:

class Foo {
private:
  class Container {};

public:
  class Utility {
  public:
    virtual void action(Container &) = 0;
    // works even if Container is private
  };

  Container container;
  Utility * utility;

  Foo(Utility * utility): container(), utility(utility) {};

  void performAction() {
    utility -> action(container);
  }
};

// polymorphic nested class
// failed attempt
class UtilityPrint : Foo::Utility {
public:
  virtual void action(Foo::Container &) {
    /* Implementation */

    // this does not work, because Foo::Container is private
  }
};

是否有实现此目的的正确方法,或者这是一个不好的主意?

我收到的错误消息是:

error: ‘class Foo::Container’ is private
   class Container {};
         ^
error: within this context
   virtual void action(Foo::Container &) {

此外,这也是我使用这种怪异设计的原因:我想要一个container和一个多态utility来对容器和Foo都起作用。由于containerutility都只能在Foo的上下文中使用,因此我将这两个类放入Foo


编辑:我可以将派生的Utility包装在派生的Foo中,然后代码进行编译:

class Foo {
protected:
  class Container {};

public:
  class Utility {
  public:
    virtual void action(Container &) = 0;
  };

  Container container;
  Utility * utility;

  Foo(Utility * utility): container(), utility(utility) {};

  void performAction() {
    utility -> action(container);
  }
};

class FooPrint : public Foo {

public:
  class Utility : Foo::Utility {
  public:
    virtual void action(Foo::Container &) {
      /* Implementation */
    }
  };

};

然而,这引入了包装器类FooPrint,该包装器类仅出于语法原因而存在,并且(它是派生类!)决不打算实例化。由于这个原因,我不喜欢这种方法,但是在这方面我可能是非常错误的。

嵌套类Foo :: Utility可以访问另一个嵌套类Foo :: Container,即使后者是私有的。我试图将此访问权限扩展到Foo :: Utility ...

c++ polymorphism inner-classes
2个回答
1
投票

访问不被继承。


0
投票

我通过class Utility { protected: using Container = Foo::Container; // Derived classes can access this. public: virtual void action(Container &) = 0; virtual ~Utility() {} // <-- remember to properly support polymorphism }; 采纳了this solution

© www.soinside.com 2019 - 2024. All rights reserved.