A nested class Foo::Utility has access to another nested class Foo::Container even if the later is private. I am trying to extend this access to a polymorphic version UtilityPrint of Foo::Utility without success:
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
  }
};
Is there a correct way to achieve this, or is this a bad idea to begin with?
The error message I get is this:
error: ‘class Foo::Container’ is private
   class Container {};
         ^
error: within this context
   virtual void action(Foo::Container &) {
Also, Here is my reason for using this somewhat weird design:
I wanted a container and a polymorphic utility that does things to both the container and Foo. Since both container and utility would only be used within the context of Foo, I put the two classes into Foo.
EDIT: I can wrap the derived Utility in a derived Foo, and the code compiles:
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 */
    }
  };
};
This however introduces a wrapper class FooPrint which exists only for syntactic reasons and is (being a derived class!) never meant to be instantiated. I don't like this approach for this reason, but I can be very wrong on this regard.