У меня проблемы с унаследованной функцией, и я не могу понять, почему он ведет себя так, как есть, и не смог найти ответ в других вопросах на SO.
Я работаю над маленькой игрой, и унаследованная функция отвечает за взаимодействие между игроком и объектами, если игрок пытается переместиться в пространство, которое уже заселено одним из различных дочерних классов «Препятствие», он будет вызывать метод «Bool GetMove» этого объекта, который затем выполняет свои уникальные правила и возвращает True, если игра может помещать игрока в пространство, или False, если он не может.Виртуальный метод, который вызывается вместо производного метода
Это заголовок базового класса и его getmove метод:
class Obstacle
{
public:
const char* id;
Obstacle* _properlyinitialized; //a pointer that points to the object itself, required by the teacher who gave the assignment.
string Name;
mutable bool Moveable;
int x;
int y;
Obstacle();
Obstacle(string Name, bool Moveable, int x, int y);
virtual ~Obstacle();
bool properlyInitialized();
friend std::ostream& operator<<(std::ostream& stream, Obstacle& Obstacle);
virtual bool getmove(const char*, std::vector<std::vector<std::vector<Obstacle> > >&);
virtual void leavetile(std::vector<std::vector<std::vector<Obstacle> > >&);
};
bool Obstacle::getmove(const char* direction,std::vector<std::vector<std::vector<Obstacle> > >& _board){
cout << "wrong getmove" << endl; //this method should never be called.
return true;
};
Один из унаследованных классов и его getmove метод:
class Barrel: public Obstacle
{
public:
Barrel():Obstacle(){};
Barrel(string Name, bool Moveable, int x, int y);
~Barrel(){};
bool getmove(const char*, std::vector<std::vector<std::vector<Obstacle> > >&);
void leavetile(std::vector<std::vector<std::vector<Obstacle> > >&);
};
bool Barrel::getmove(const char* direction,std::vector<std::vector<std::vector<Obstacle> > >& _board){
cout << "barrel getmove" << endl;
if(strcmp(direction, "OMHOOG") == 0){ //what direction to move?
if(_board[this->x][this->y-1][0].properlyInitialized()){ //is that object already inhabited by an object?
if(_board[this->x][this->y-1][0].Moveable){ //can the object be moved?
if(_board[this->x][this->y-1][0].getmove(direction, _board){//move the object
_board[this->x][this->y-1][0] = *this; //move the barrel
_board[this->x][this->y-1][0]._properlyinitialized = &_board[this->x][this->y-1][0];
return true; //return true
}
else{
return false; //an object is in the way, the barrel can't be moved
}
}
else{
return false; //an object is in the way, the barrel can't be moved
}
}
else{
_board[this->x][this->y-1][0] = *this; //move the barrel
_board[this->x][this->y-1][0]._properlyinitialized = &_board[this->x][this->y-1][0];
return true; //return true
}
} //This is for direction "up", i left the other directions out because they're almost equal.
Метод вызывается следующим образом:
//"this" is a board object
if(this->playfield[this->_player->x][(this->_player->y)-1][0].getmove(direction, this->getBoard())){
//do some stuff
}
Я рассмотрел возможность изменения объекта Obstacle на чистый виртуальный объект, но мне нужен фиктивный " Obstacle "в другом месте, поэтому это не вариант.