私は、クラス構造を単純化することから始めるべきだと思います。そうすれば、問題をよりよく説明できるようになります。これは、仮想の使用についての誤解である可能性があります。
私は持っています:
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();
}
}