我有一个Graphic
类来处理Item
的绘制,所以我的所有Item
类都会继承它。
从本质上讲,我有一个Graphic::Draw(type argX, type argY)
方法,需要argX
和argY
通过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
基本方法,因为我不想显然覆盖函数体...
那我该怎么做呢?感谢。
答案 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
。