2009-09-21 74 views
1

以下内容有效吗?或者我怎么能够接近这个。重新定义派生类的变量

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

在此先感谢。

回答

6

这在技术上是“有效的”,在你的编译器必须接受它(它可能警告你,恕我直言应该),但它不会做你认为它的作用:Derived的variable是分开Parent's,并且不是得到显式初始化(​​因此它使用Template<>的默认ctor)。

1

如果你想在基类和派生类中有一个相同名字的变量,你不需要模板。

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

+0

因此,基地调用变量将获得它自己的版本。 – 2009-09-21 16:32:49

1

很少有小类型。
但主要问题是,父母在模板上使用了一个不存在的构造函数。

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

我很好奇你在努力达到什么目的。
这是“好奇复发模板”模式的一些变化或什么?

+0

这与我的活动系统类似。模板= EventChain。事件声明应该是void处理程序(T_&caller,.....)。父触发器变量(ClickEvent)事件。所以通过某种方式声明Derived类中的ClickEvent我希望允许用户定义处理程序(Derived&)而不是处理程序(Parent&)。 – 2009-09-21 16:51:08

1

你不应该得到的东西接近这个,因为一个公共变量的这种重新定义违反Liskov Substitution Principle - 你Derived变得比Parent更严格,且不能在它的位置被取代,因此它不应该是一个超类/子类关系。

此外,如果将允许你重新定义的实际重复使用相同的内存位置总得意义上的场,那么它会打破类型系统,以及:在Parent所有方法期望variableTemplate<Parent>型;如果它实际上是Template<Derived>的实例,则不能保证Template<T>T中是协变的。