[英]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
(並因此間接地從SlimFSM
和SlimEventHandler
):
// 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.