Краткое описание:
Я перебираю вектор, вызывая виртуальную функцию для каждого объекта в векторе, чтобы выполнить последовательность действий. Вектор имеет базовый класс, как и итератор. Все предметы - дети. Когда виртуальная функция вызывается, она выполняет функцию базового класса.
(Действительно) Длинное описание:
Я пытаюсь смоделировать существо с набором поведений. Мой базовый класс является абстрактным, только с двумя (виртуальными) функциями, которые переопределены всеми подклассами:
class Behavior
{
public:
Behavior();
~Behavior(void){}
virtual void execute(){}
virtual BEHAVIOR_TYPE getType() {return m_Type;}
protected:
BEHAVIOR_TYPE m_Type;
};
Я создал несколько моделей поведения детей, таких как перемещение, потребление, разведка и т. Д.
class Move :
public Behavior
{
public:
BEHAVIOR_TYPE getType() {return m_Type;}
enum Direction {N, NE, E, SE, S, SW, W, NW};
Move(DOCO * d);
~Move(void);
void execute() ;
Direction chooseDirection();
void setDirection(Direction newDirection);
private:
Direction m_Direction;
DOCO *I;
BEHAVIOR_TYPE m_Type;
};
Я создал вектор, в который помещал экземпляры каждого подкласса поведения, а также итератор для его обхода:
vector<Behavior> m_Behavior;
vector<Behavior>::iterator bIt;
Когда существо получает последовательность действий, я пытаюсь перебрать вектор, разыменовать итератор и вызвать функцию execute:
void World::justDoIt()
{
for(dIt=myDOCO.begin(); dIt!=myDOCO.end(); ++dIt)
{
vector<Behavior>::iterator myBehavior=(dIt)->getFirstBehavior();
vector<Behavior>::iterator end=(dIt)->getLastBehavior();
for(myBehavior; myBehavior!=end; ++myBehavior)
(*myBehavior).execute();
}
}
Проблема в том, что он выполняет функцию родителя, а не функцию ребенка.
В моем понимании позднего связывания он должен автоматически вызывать соответствующую функцию в зависимости от типа объекта, который его вызывал, а не от типа указателя, с которым он был вызван, и в моем коде я ожидал, что он будет указывать дочерний объект.
Очевидно, я допустил ошибку и как-то сказал программе, что хочу, чтобы с ними обращались как с родителями, а не с детьми, но я не могу найти свою ошибку.
Вторым симптомом является то, что он не позволит мне заставить родителей функционировать чисто виртуально, потому что он говорит, что не может создать экземпляр абстрактного класса. Я не использую это явно в каком-либо месте моего кода, но должно быть где-то, где я делаю это неявно Я не могу найти где, однако. Конечно, создание вектора для хранения объектов родительского класса не требует создания экземпляра родительского класса, и это единственный раз, когда я ссылаюсь на родительский класс напрямую.
Любая помощь будет принята с благодарностью.