【问题标题】:Redefine a derived class' variable重新定义派生类的变量
【发布时间】:2009-09-21 16:21:17
【问题描述】:

以下内容有效吗?或者我怎样才能得到接近这个的东西。

template<class T_> class Template {
   //something
};

class Parent {
public:
   Template<Parent> variable;

   Parent() : variable(this) { }
};

class Derived : public Parent {
public:
   Template<Derived> variable;

   Derived() : Parent() { }
}

提前致谢。

【问题讨论】:

    标签: c++ inheritance


    【解决方案1】:

    它在技术上是“有效的”,因为你的编译器必须接受它(它可能警告你,恕我直言它应该),但它不会做你做的事认为确实如此:Derived 的 variable 与 Parent 是分开的,并且没有被显式初始化(​​因此它使用 Template&lt;&gt; 的默认 ctor)。

    【讨论】:

      【解决方案2】:

      如果您想在基类和派生类中拥有同名的变量,则不需要模板。

      只需定义它们并从派生访问 -> 变量和 ->Base::variable。这是两个不同的变量。

      【讨论】:

      • 因此,碱基调用变量将获得自己的版本。
      【解决方案3】:

      少数次要类型。
      但主要问题是 Parent 在 Template 上使用了一个不存在的构造函数。

      template<class T>
      class Template
      {
          public:
              Template()      {}  // Used in Derived
              Template(T* t)  {}  // Used in Parent
      };
      
      class Parent
      {
          public:
             Template<Parent> variable;
      
              Parent() : variable(this)   {}
      };
      
      class Derived : public Parent
      {
          public:
             Template<Derived> variable;
      
             Derived() : Parent()         {}
      };
      

      我很好奇你想要达到什么目的。
      这是“奇怪重复出现的模板”模式的某种变体还是什么?

      【讨论】:

      • 这是与我的事件系统类似的方案。模板=事件链。事件声明应该是 void handler(T_ &caller, .....)。父级触发变量 (ClickEvent) 事件。因此,通过在 Derived 类中以某种方式声明 ClickEvent,我希望允许用户定义 handler(Derived &) 而不是 handler(Parent &)。
      【解决方案4】:

      你不应该得到接近这个的东西,因为公共变量的这种重新定义违反了Liskov Substitution Principle - 你的Derived 变得比Parent 更具限制性,并且不能代替它,因此它应该'不在超类/子类关系中。

      此外,如果它允许您重新定义一个字段,以某种方式实际重用相同的内存位置,那么它也会破坏类型系统:Parent 中的所有方法都期望 variable 是类型Template&lt;Parent&gt;;如果它实际上是Template&lt;Derived&gt; 的实例,则不能保证Template&lt;T&gt; 在T 中是协变的。

      【讨论】:

        猜你喜欢
        • 2015-05-20
        • 2011-11-15
        • 1970-01-01
        • 2015-08-11
        • 2014-02-19
        • 2012-03-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多