継承その2

ちょっとややこしいvirtualメソッド。


class Sound
{
public:
    virtual ~Sound() { stop(); }
    virtual void play() { stop(); 再生処理(); }
    virtual void stop() { 停止処理(); }
};

class SoundEx : public Sound
{
public:
    virtual ~SoundEx() { stop(); }
    virtual void play() { stop(); ごにょごにょ(); Sound::play(); }
    virtual void stop() { Sound::stop(); 巻き戻し処理(); }
};

SoundEx::stop()は停止してから巻き戻す処理を追加します。
SoundEx::play()はstop()した後ごにょごにょ()してSound::playをコールします。
そのSound::play()内で呼ばれるstop()はSound::stopを期待しているのですが、
実際にはSoundEx::stop()がコールされてしまいます。


class Sound
{
public:
    virtual ~Sound() { stop(); }
    virtual void play() { Sound::stop(); 再生処理(); }
    virtual void stop() { 停止処理(); }
};


としておけば期待通りの挙動をします。


Sound::play()としたならばその内部でもSoundのメソッドがコールされて欲しいのですが(´ω`)
~Sound()では既にSoundExは解体されている(v-tableも書き換わる)のでSound::stopがコールされます。


Soundクラス内でSound::と付けるのは少し違和感があります。
でも絶対にこのメソッドを呼んでほしいという場合にはこうすべきなんでしょうか。