簡體   English   中英

在C ++中具有多重繼承的奇怪的多態行為?

[英]Weird polymorphism behavior with multiple inheritance in C++?

所以,我正在使用SDL寫一個小Pong游戲克隆,我有以下設置。

有一個通用游戲類SlimGame ,它繼承自FSM類和事件處理程序類:

// DEFINITION
class SlimGame : public SlimFSM, public SlimEventHandler {
protected:
  bool    running;        // indicates if the game is running

public:
  bool isRunning() { return this->running; }
  void setRunning(bool r) { this->running = r; }

  void run();                         // encapsulates the game loop
};

// IMPLEMENTATION
void SlimGame::run() {
  SDL_Event event;

  this->setRunning(true);

  while(this->isRunning()) {
      while(SDL_PollEvent(&event)) {
          this->handleEvent(&event);
          std::cout << "MAIN LOOP Running: " << this->isRunning(); << endl;
      }

      // ...
  }
}

FSM類與奇怪的行為無關,但事件處理程序類如下所示:

// DEFINITION
class SlimEventHandler {
public:
  SlimEventHandler() { }
  virtual ~SlimEventHandler() { }

  void handleEvent(SDL_Event *event);

  virtual void onExit();
};

// IMPLEMENTATION
void SlimEventHandler::handleEvent(SDL_Event *event) {
  switch(event->type) {
    case SDL_QUIT:
      this->onExit();
      break;
  }
}

void SlimEventHandler::onExit() {
  std::cout << "PARENT onExit!" << std::endl;
}

然后,我有我的PongGame類本身從繼承SlimGame (並因此間接地從SlimFSMSlimEventHandler ):

// DEFINITION
class PongGame : public SlimGame {
public:
  PongGame();
  ~PongGame();

  void onExit();
};

// IMPLEMENTATION
void PongGame::onExit() {
  this->setRunning(false);

  std::cout << "CHILD onExit!" << std::endl;
}

因此,通過這種設置,我像這樣運行我的游戲並啟動,很好:

int main(int argc, char **argv) {
  PongGame game;

  // setup

  game.run();

  // tear down

  return 0;
}

但是,事件處理不能按預期的方式工作。 如果單擊窗口關閉按鈕, SDL_QUIT觸發SDL_QUIT事件並調用方法handleEvent 這是好的,但方法本身調用onExit自己的,而不是繼承的方法PongGame課,所以我請參見:

PARENT onExit!

在控制台而不是

CHILD onExit!

不應該在派生方法PongGame被調用,而不是在虛擬空實現SlimEventHandler

您應該將run()方法聲明為virtual,以強制將對象指針解釋為PongGame對象,因為目前它不是。 某些編譯器可能會警告您也要覆蓋run()。 在這種情況下,run()的PongGame實現可以是一個簡單的代碼重復,大多數時候都是無害的。

void PongGame::run() {
    SlimGame::run();
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM