0

私は、クラス構造を単純化することから始めるべきだと思います。そうすれば、問題をよりよく説明できるようになります。これは、仮想の使用についての誤解である可能性があります。

私は持っています:

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();

   }

}
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 に答える