一个嵌套类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
都起作用。由于container
和utility
都只能在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 ...
访问不被继承。
我通过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: