继承/多态 - 子类的调用方法

Ben*_*Ben 0 c++ inheritance

在下面,我怎样才能使程序使用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纯粹的虚拟,所以请提出别的建议.

Luc*_*ore 5

我如何才能使程序使用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)