Хорошо, поэтому я пытаюсь создать систему компонентов/сущностей для своего игрового движка, и у меня есть база class component
, которая имеет виртуальный метод update()
, а затем все различные типы компонентов выводятся из этого базового класса. Я сохраняю указатели на эти компоненты в массиве, а затем перебираю массив, вызывающий метод обновления. Когда у меня есть только один тип производного класса, это отлично работает, он вызывает производный виртуальный метод, но как только я добавляю другой тип производного класса, он начинает использовать базовый метод обновления. Вот и пример:Вызов виртуальных методов разных производных классов в одном массиве указателей
//Hold the pointers to the Components
Component** components;
//in the system constructor I initialize the array of components
void System::System()
{
components = new Component*[MAX_COMPONENTS]();
}
//Inputlistener is a derived component
InputListener* inputListener;
inputListener= new InputListener;
//Playercontroller is also derived component
PlayerController* playerController;
playerController = new PlayerController;
//Adds the pointer to the components array
system->add(inputListener);
system->add(playerController);
//loops over the array the update method is a virtual method
system->update(); //calls the base classes update method not the derived
Из того, что я прочитал в Интернете, что шов, как это должно быть возможным, так как массив просто держит указатель а не сам объект, поэтому они должны быть нарезаны в базовый класс. Если я действительно ошибаюсь в отношении этого предположения, что было бы решением?
Вы пробовали? Это сработало? На стороне примечания, почему бы не использовать 'vector' по крайней мере - предпочтительно какую-нибудь конструкцию умных указателей. –
Слишком плохо, что вы не указали какой-либо код, который имеет значение. В любом случае, ответ заключается в том, что у вас есть ошибка в некотором коде, который вы не показывали. – juanchopanza
Это не выглядит неправильно. Отправьте минимальный и полный пример, который показывает проблему. – molbdnilo