重新定义派生类的变量

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 的 variableParent 是分开的,并且没有被显式初始化(​​因此它使用 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 中是协变的。

【讨论】:

以上是关于重新定义派生类的变量的主要内容,如果未能解决你的问题,请参考以下文章

从派生类重新定义基类中定义的结构

通过指向派生类的指针访问派生成员变量

类的继承

继承与派生

关于C++基类与派生类

获取派生类以显示与派生类的父类具有聚合关系的抽象类中的变量的 C++ 错误