0

我认为我应该从简化我的类结构开始,以便更好地解释我的问题,我怀疑这可能只是对使用 virtual 的误解。

我有:

class Controller{
..
    virtual void InitialiseController(){ //std::cout confirms this is running }
..
}

class AIController : public Controller{
..
    virtual void InitialiseController(){ //some logic here }
..
}
class ComController : public AIController{
..
    virtual void InitialiseController(){ //actually the same logic as parent }
..
}

我的对象 Snake 有一个指向 Controller 的指针(Controller* _controller)。当我调用该snake.initialise(..)方法时,我向它传递了一个新的 ComController 对象,该对象然后将蛇 _controller 设置为等于新的 ComController。我知道这个过程很成功。

但是当我随后调用_controller.InitialiseController();我的调试器时,会显示程序步骤进入基类 Controller 的 InitialiseContoller 的空白实现。

我知道我可能过于简单化了,您可能无法提供帮助,但我认为这可能是我对整个概念的不理解,一个逻辑错误,而不是一个输入错误,并想检查一下。

附加代码:

_player2->Initialise(_gameProperties, &_fruitManager, new ComController(_player2), _player1);

踏入..

void Snake::Initialise(
   GamePropertiesManager* gpm, FruitManager* fm, Controller* control, Snake* opposingSnake)
{
   _game = gpm;
   _fruitManager = fm;
   _controller = control;
   _opposition = opposingSnake;

   if(_controller){

           ///Bunch of stuff in here runs just fine


      // This primarily serves to ensure that a ComControllers timer is started, but other controllers might wish to override initialise later
      _controller->IntialiseController();

   }

}
4

2 回答 2

1

我真的没有看到你正在做的事情有什么问题(至少就理解和使用虚拟方法而言)。

这是一个完整的例子。请与您的代码进行比较。

#include <stdio.h>

class Controller{
public:
    virtual void InitialiseController(){
      printf ("base class controller...\n");
    }
};

class AIController : public Controller{
public:
    virtual void InitialiseController(){
      printf ("AIController subclass controller...\n");
    }
};

class ComController : public AIController{
public:
    virtual void InitialiseController(){
      printf ("ComController subclass controller...\n");
    }
};

int main (int argc, char *argv[])
{
   Controller *myController = new ComController ();
   myController->InitialiseController ();
   return 0;
}

编译: g++ -Wall -pedantic -o tmp tmp.cpp

执行: ComController subclass controller...

于 2012-04-26T19:07:58.613 回答
1

我认为您是直接在对象上调用虚拟方法。只有当您通过指针或引用调用时,多态才会发挥作用。

编辑:你写两个_controller.InitialiseController();_controller->InitialiseController();(以前有吗?),所以我不完全确定你在做什么。

于 2012-04-26T19:29:34.827 回答