在下面,我怎样才能使程序使用draw方法MainMenuScreen而不是来自GameScreen?
class GameScreen {
public:
virtual void GameScreen::draw() {
cout << "Drawing the wrong one..." << endl;
}
};
class MainMenuScreen : public GameScreen {
public:
void MainMenuScreen::draw() {
cout << "Drawing the right one..." << endl;
}
};
class ScreenManager {
public:
list<GameScreen> screens;
// assume a MainMenuScreen gets added to the list
void ScreenManager::draw()
{
for ( list<GameScreen>::iterator screen = screens.begin();
screen != screens.end(); screen++ )
{
screen->draw(); /* here it uses the draw method from GameScreen,
but I want it to use the draw method from
MainMenuScreen */
}
}
};
Run Code Online (Sandbox Code Playgroud)
PS:我不想做GameScreen::draw纯粹的虚拟,所以请提出别的建议.
我如何才能使程序使用MainMenuScreen中的draw方法而不是GameScreen中的方法?
你不能,除非你在实际类型的指针或引用上调用它MainMenuScreen.
list<GameScreen> screens;
Run Code Online (Sandbox Code Playgroud)
声明一个list对象,而不是指针或引用.如果向其添加MainMenuScreen对象,由于对象切片而无法使用多态,它们将丢失类型信息.你需要:
list<GameScreen*> screens;
Run Code Online (Sandbox Code Playgroud)
或者,更好的是:
list<shared_ptr<GameScreen> > screens;
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
399 次 |
| 最近记录: |