我有类似以下代码
class GameObject
{
public:
virtual void update(...) = 0;
virtual void render(...) = 0;
};
class Sprite : public GameObject
{
public:
Sprite();
~Sprite()
{
}
void setSrcRect()noexcept
{
//Some code
}
void setDstRect()noexcept
{
//Some code
}
uint32_t getWidth() const noexcept { return width_; }
uint32_t getHeight() const noexcept { return height_; }
virtual void update(...) override
{
//Some code
}
virtual void render(...) override
{
//Some code
}
};
后来我创建了
之类的对象GameObject* obj = new Sprite();
问题是我无法调用类似的方法
obj->getWidth();
我可以在GameObject中添加这些方法,但我想保持其纯接口。仅具有纯虚拟方法。我之所以选择这样的GameObject,是因为当我以后在游戏中拥有更多对象时,它将为我带来好处。
我可以存储它们
std::vector<GameObject*> actors;
我可以做的渲染
for(const auto actor: actors)
{
actor->render();
}
除了当前精灵外,还可以再有一个GameObject SpriteSheet,依此类推。我该怎么做才能做到这一点?保持GameObject不变,但向从其继承的类中添加方法。
我确实知道精灵的类型仍然是GameObject,方法调用只能在运行时解决。因此,我是否要求任何其他方法来实现这一目标?
答案 0 :(得分:1)
使用dynamic_cast:
auto sprite_game_obj = dynamic_cast<Sprite*>(obj);
if(sprite_game_obj) sprite_game_obj->getWidth()
或更短的
dynamic_cast<Sprite*>(obj)->getWidth()