gpt4 book ai didi

C++ 方法继承帮助

转载 作者:行者123 更新时间:2023-11-28 08:24:39 26 4
gpt4 key购买 nike

我有一个 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() 方法命名为 Item::Draw()。但是,Item::Draw() 方法将与 Graphic::Draw 方法同名。但是我不能使用 virtual 基方法,因为我显然不想覆盖函数体...

那么我应该怎么做呢?谢谢。

最佳答案

您可以将 child 对 Draw 的调用范围限定为调用 Graphic::Draw(type,type) 明确...例如:

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=&i; g->绘制(foo,bar);

我的建议是:

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; }
...
};

当然,您最好将 type mXtype mY 迁移到基类中首先...大概大多数图形对象都有一个x,y位置...

关于C++ 方法继承帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4476348/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com