重新定义派生类的变量
Posted
技术标签:
【中文标题】重新定义派生类的变量【英文标题】: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()
提前致谢。
【问题讨论】:
【参考方案1】:它在技术上是“有效的”,因为你的编译器必须接受它(它可能警告你,恕我直言它应该),但它不会做你做的事认为确实如此:Derived 的 variable
与 Parent
是分开的,并且没有被显式初始化(因此它使用 Template<>
的默认 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<Parent>
;如果它实际上是Template<Derived>
的实例,则不能保证Template<T>
在T
中是协变的。
【讨论】:
以上是关于重新定义派生类的变量的主要内容,如果未能解决你的问题,请参考以下文章