代码之家  ›  专栏  ›  技术社区  ›  Cem Kalyoncu

重新定义派生类的变量

  •  1
  • Cem Kalyoncu  · 技术社区  · 16 年前

    下列各项是否有效?或者我怎样才能接近这个。

    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() { }
    }
    

    提前谢谢。

    4 回复  |  直到 16 年前
        1
  •  6
  •   Alex Martelli    16 年前

    它在技术上是“有效的”,因为编译器必须接受它(它) 也许 应该 ),但它不做你认为它做的事:派生的 variable Parent 是的,是的 正在显式初始化(因此它对 Template<> ).

        2
  •  1
  •   Arkaitz Jimenez    16 年前

    如果您希望在基类和派生类中具有相同名称的变量,则不需要模板。

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

        3
  •  1
  •   Loki Astari    16 年前

    少数小类型。
    但主要问题是父级在模板上使用的构造函数并不存在。

    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()         {}
    };
    

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

        4
  •  1
  •   Pavel Minaev    16 年前

    Liskov Substitution Principle Derived 变得比以前更具限制性 Parent ,并且不能代替它,因此它不应该处于超类/子类关系中。

    此外,如果它允许您在某种意义上重新定义一个字段,实际上以某种方式重用相同的内存位置,那么它也会破坏类型系统:中的所有方法 父母亲 预料 variable 类型 Template<Parent> Template<Derived> ,我们不能保证 Template<T> 是协变的 T