继承C ++中受保护的类

时间:2008-09-30 15:58:55

标签: c++ inheritance oop private

假设我有以下声明:

class Over1
{
   protected:
      class Under1
      {
      };
};

我知道我可以做以下事情:

class Over2 : public Over1
{
   protected:
        class Under2 : public Under1
        {
        };
};

但是有没有办法在没有Over2的情况下声明Under2?

由于您必须扩展Over1以使用Under1的任何衍生物,这可能看起来很愚蠢,但在这种情况下可能会有30种不同的Under。我可以:

  • 将它们全部放在Over1中:不是 因为Over2可能只能使用 其中1或2个
  • 将它们分别放进去 他们自己的版本Over:Not 从那以后你会有吸引力 从几乎繁衍到继承 同班。
  • 找到一种创造方式 Under1的孩子没有创造 Over1的孩子

这可能吗?

感谢。

4 个答案:

答案 0 :(得分:1)

比创建嵌套类更好,您可能希望将这些关闭嵌入到命名空间中。这样,您不需要外部类来获取内部类。 Google C++ Style Guide中有一些很好的论据支持和反对。

答案 1 :(得分:1)

使用模板和显式特化,只需在Over1中添加一个类声明即可。

class Over1
{
protected:
  class Under1
  {
  };

  template <typename T>
  class UnderImplementor;
};

struct Under2Tag;
struct Under3Tag;
struct Under4Tag;

template <>
class Over1::UnderImplementor<Under2Tag> : public Over1::Under1
{
};

template <>
class Over1::UnderImplementor<Under3Tag> : public Over1::Under1
{
};

template <>
class Over1::UnderImplementor<Under4Tag> : public Over1::Under1
{
};

希望这有帮助。

答案 2 :(得分:0)

如果要保持Under1受保护,那么根据定义,您需要从Over1继承才能访问它。我建议将Under1公开,或者像Douglas建议的那样使用命名空间。

我现在没有编译器来测试这些,所以我不确定这些是否可行,但你可以试试这个:

class Over1
{
   protected:
      class Under1
      {
      };

   public:
      class Under1Interface : public Under1 
      {
      };
};

class Under2 : public Over1::Under1Interface
{
};

也许是这样的:

class Over1
{
   protected:
      class Under1
      {
      };
};

class Under2 : private Over1, public Over1::Under1
{
};

甚至:

class Under2;

class Over1
{
   friend class Under2;

   protected:
      class Under1
      {
      };
};

class Under2 : public Over1::Under1
{
};

虽然这会将所有Over1s私有暴露给Under2 - 不太可能是你想要的东西。

答案 3 :(得分:0)

听起来像是一个时髦的设计。为什么不尝试以不同方式构建代码。我认为这可能是装饰器模式的一个很好的候选者,你可以将你的基类包装在各种装饰器中以实现所需的功能,'under'的各种风格可能是装饰器。只是一个想法,很难在不了解您的代码意图的情况下进行分析。