我认为我应该从简化我的类结构开始,这样我就能更好地解释我的问题,我怀疑这可能只是对虚拟使用的误解。
我有:
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对象,然后将snakes _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();
}
}
答案 0 :(得分: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...
答案 1 :(得分:1)
我认为你直接在对象上调用虚方法。只有通过指针或参考调用时,多态性才会启动。
编辑:您同时写了_controller.InitialiseController();
和_controller->InitialiseController();
(之前有吗?),所以我不完全确定您在做什么。