调用子方法

时间:2015-02-26 10:41:04

标签: c++ abstraction object-slicing

在我的C ++项目中,我有一个名为Trap的类。陷阱是NPC,NPC是实体。现在我想循环遍历所有NPC并用它们做些事情。例如,我想要一个陷阱来更新。我是通过以下方式做到的。

for (vector<NPC>::iterator it = Enemies.begin(); it != Enemies.end(); ++it) {
    it->Update();
}

但是现在Update()调用正在调用NPC :: Update()方法。

我确信这是因为我使用迭代器的方式,但我不知道如何更好地做到这一点。使用不同类型的迭代?对此有一个简单的伎俩吗?

2 个答案:

答案 0 :(得分:4)

您有Slicing个问题。

Enemies应为std::vector<std::unique_ptr<NPC>>(或其他智能指针)或std::vector<NPC*>

答案 1 :(得分:0)

您想要的是一个纯虚拟基类,它定义了派生类的所有基本功能。然后,您可以在子类中实现实际代码,并仍然通过基类调用update()方法。

class Base
{
    virtual void update() = 0
}

class Implementation: public Base
{
    void update() { /*Do stuff*/ }
}

接下来创建一个vector< unique_ptr<Base> >(无论你需要什么样的指针类型)并用new( Implementation )填充它,然后你可以遍历你的向量并执行Base->update()