Вызов дочернего метода

В моем C++ проекте у меня есть класс Trap. Ловушка - это NPC, а NPC - это сущность. Теперь я хочу пройтись по всем NPC и делать с ними вещи. Например, я хочу обновить Trap. Я делаю это следующим образом.

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

Но теперь вызов Update() вызывает метод NPC::Update().

Я уверен, что это из-за того, как я использовал итератор, но я не знаю, как лучше это сделать. Использовать другой вид итерации? Есть ли простой трюк для этого?

2 ответа

Решение

У вас есть проблема с нарезкой.

Enemies должно быть std::vector<std::unique_ptr<NPC>> (или другой умный указатель) или std::vector<NPC*>

Вам нужен чисто виртуальный базовый класс, который определяет все основные функции для вашего производного класса. Затем вы можете реализовать фактический код в ваших подклассах и все еще вызывать метод update() через базовый класс.

class Base
{
    virtual void update() = 0
}

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

Далее создайте vector< unique_ptr<Base> > (какой бы тип указателя вам не понадобился) и заполните его new( Implementation ) и вы можете затем перебрать свой вектор и сделать Base->update(),

Другие вопросы по тегам