重新定义派生类的变量

时间:2009-09-21 16:21:18

标签: c++ inheritance

以下是否有效?或者我怎样才能得到与此相近的东西。

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 个答案:

答案 0 :(得分:6)

技术上“有效”,因为你的编译器必须接受它(可能警告你,恕我直言应该),但它不会做你所做的认为它确实如此:派生的variableParent是分开的,显式初始化(​​因此它使用Template<>的默认ctor。) / p>

答案 1 :(得分:1)

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

只需定义它们,然后从派生访问 - &gt;变量和 - &gt; Base ::变量中定义它们。这是两个不同的变量。

答案 2 :(得分:1)

几种次要类型。
但主要问题是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()         {}
};

我很好奇你想要达到的目标 这是“奇怪的重复发生的模板”模式的某种变化吗?

答案 3 :(得分:1)

你不应该接近这一点,因为这种对公共变量的重新定义违反了Liskov Substitution Principle - 你的Derived变得比Parent更具限制性,并且无法替代它place,因此它不应该是超类/子类关系。

此外,如果它允许你重新定义一个实际重用相同内存位置的意义上的字段,那么它也会打破类型系统:Parent中的所有方法都期望variable属于Template<Parent>类型;如果它实际上是Template<Derived>的实例,则无法保证Template<T>中的T是协变的。