嵌套类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 attemptclass 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,该包装器类仅出于语法原因而存在,并且(它是派生类!)决不打算实例化。由于这个原因,我不喜欢这种方法,但是在这方面我可能是非常错误的。 最佳答案 访问没有继承。在讨论friends时,通常会提到此问题,但在这里也适用。首先,让我们看看为什么Foo::Utility::action可以访问私有类Foo::Container。实际上,它就在名称中。 Foo::Container只能由Foo的成员访问,并且Foo的成员可以在您写出其限定名称并且名称以“ Foo::”开头时被识别。相反,UtilityPrint不是Foo的成员。 (实际上,如果有人只说“哦,是的,我也是会员!”并访问您的私人信息,那将是严重的安全违规。)因此,尽管UtilityPrint具有(受保护的)访问,它无法访问Foo::Utility有权访问的所有内容。如果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};这仍然悬而未决,这是否是一个好的设计问题。我认为这是一个警告标记,表明可能有故障,但并非最终如此。这个问题没有足够的背景信息让我打电话。我只是给你一个指导方针,如果您觉得自己正在绕过许多语言功能(例如私有访问),那么设计可能需要工作。 10-06 13:20