仮想関数を持つ抽象基本クラスを拡張し、仮想関数として関数名を保持したいが、 "おそらく"オーバーライドされた子関数の前後にコードを実行したい。ここで同じクラス内の純粋仮想関数をオーバーライドできますか?
は一例です:
は、私が描くことができるもののために、基本クラス(インターフェース)を持つ:
class IDraw {
public:
virtual void do_draw(Screen *scr) = 0;
};
私はサブクラスでこのインタフェースを維持し、それを上書きすることができるようにしたいです、例えば 私は、画面をきれいにゲームのためのクラスを、持っているものを描き、表示バッファ反転より:私は前と後のコードを持っているので
class Game : public IDraw {
public:
// Keep the interface
// This can be overridden by sub classes
virtual void do_draw(Screen *scr) = 0; // (1)
private:
// But override the base class so if s.b. calls
// do_draw from a IDraw pointer it executes this!
void IDraw::do_draw(Screen *scr) override; // (2)
};
// Implementation of (2)
void Game::IDraw::do_draw(Screen *scr) {
// Do stuff before like clear the screen
scr->clear();
// Call the method supplied by childs
this->do_draw(scr); // (1)
// Present the drawing
scr->present();
}
を子供が提供している関数は、その前または後にGame :: do_draw()//(2)を呼び出すかどうかを子供が決定しなければならないため、仮想を保持しておくだけではオーバーライドできません。
私は単純に関数(2)を別の名前で呼び出すことができますが、このようなことを行う多くのクラスが必要なので、同じ概念の名前がたくさんあります。
C++ 11でこのようなことをする方法はありますか?
いいえ。異なる名前の関数を上書きすることはできません。 – SergeyA