C ++方法继承帮助

时间:2010-12-18 02:54:47

标签: c++ inheritance polymorphism overloading

我有一个Graphic类来处理Item的绘制,所以我的所有Item类都会继承它。

从本质上讲,我有一个Graphic::Draw(type argX, type argY)方法,需要argXargY通过Item方法传递给它。

所以我想我可以很容易地拥有这样的Item::DrawMe()方法:

class Graphic {
    ...
    void Draw(type argX, type argY)
    {
        // drawing code
    }
    ...
}


class Item : public Graphic {
    ...
    type mX;
    type mY;
    ...
    void DrawMe() : Draw(this->mX, this->mY) { }
    ...
};

但我宁愿使用名为Item::DrawMe()的{​​{1}}方法。但是,Item::Draw()方法将与Item::Draw()方法具有相同的名称。但是我不能使用Graphic::Draw基本方法,因为我不想显然覆盖函数体...

那我该怎么做呢?感谢。

2 个答案:

答案 0 :(得分:1)

您可以调整孩子对 绘制 的调用范围,以调用 Graphic :: Draw(类型,类型) 明确......例如:

class Graphic {
    ...
    virtual void Draw(type argX, type argY)
    {
        // drawing code
    }
    ...
}


class Item : public Graphic {
    ...
    type mX;
    type mY;
    ...
    virtual void Draw() { Graphic::Draw( this->mX, this->mY ); }
    ...
};

但请注意 Item :: Draw(void) 阴影(隐藏) Item :: Draw(type,type) 即可。您不会在子类中看到两个重载(例如 Item 对象)。你必须使用显式范围...(如 ItemObject-> Graphic :: Draw(x,y) 。)或者可能是“使用“条款......

此外,您遇到了关于多态性的编码复杂性...通过单个虚拟Draw()方法引用一组 Graphic 对象是很好的。例如:项目i;图形* g =&一世; G->绘制(FOO,巴);

我建议的是:

class Graphic {
    ...
    virtual void Draw(type argX = LOADDATA, type argY = LOADDATA)
    {
       if ( argX == LOADDATA )  argX = getArgX();
       if ( argY == LOADDATA )  argY = getArgY();

        // drawing code
    }
    virtual type getArgX() { return DEFAULT_ARGX; }
    virtual type getArgY() { return DEFAULT_ARGY; }
    ...
}


class Item : public Graphic {
    ...
    type mX;
    type mY;
    ...
    virtual type getArgX() { return mX; }
    virtual type getArgY() { return mY; }
    ...
};

当然,您最好将 类型mX 类型mY 迁移到基类中开始...大概 图形 对象将有一个 x,y 位置...

答案 1 :(得分:0)

由于您需要为每个孩子Draw提供不同的功能,因此无法解决问题,如果您不能使用virtual,那么您必须为父和子功能选择单独的名称。只需命名父函数DoDraw和子Draw