Вызов дочернего метода
В моем 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()
,