2015-06-10 5 views
0

У меня проблемы с унаследованной функцией, и я не могу понять, почему он ведет себя так, как есть, и не смог найти ответ в других вопросах на 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 "в другом месте, поэтому это не вариант.

ответ

2

Второй аргумент getmove должен быть

std::vector<std::vector<std::vector<Obstacle*>>>& 

Обратите внимание, что внутренний наиболее вектор из Obstacle* и не Obstacle? Таким образом, будет вызвана правильная виртуальная функция, и, что более важно, вы не столкнетесь с object slicing