Windowsプログラミングの雛形を作るために、仮想関数について説明します。
次のようなクラスを作ります。 メソッドの前に、"virtual" が付いています。
class MyMainWnd{
public:
virtual void setMyWnd(WNDCLASSEX& wc, CREATESTRUCT& cs){}
};
MyMainWnd型の変数を用意します。
MyMainWnd wd;
この場合、次のように使っても "virtual" は機能しません。 "virtual" は、継承した子クラスで機能します。
wd.setMyWnd(wc, cs);
今は、メソッドの中身は空なので、何もしません。 次に、このクラスを継承します。
class MyApp : public MyMainWnd{ };
MyApp型の変数を用意します。
MyApp wd;
この場合も、"virtual" は影響なく、次のように使います。
wd.setMyWnd(wc, cs);
さて、関数は、引数が異なれば幾つでも作れます。 しかし、クラスの継承の場合、同じメソッドも書くことができます。 次は、中身があります。
class MyApp : public MyMainWnd{ void setMyWnd(WNDCLASSEX& wc, CREATESTRUCT& cs){ wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1); // 背景ブラシ } };
ここで、"virtual" が機能します。 wd.setMyWnd(wc, cs) とすれば MyAppクラスのメソッドが呼び出されます。
しかし、"virtual" を付けなければ、親のメソッドが呼ばれ、子のメソッドは無視されます。 というより、同じメソッドが2つ存在するのですから、どちらのメソッドを呼んでいるのか、あいまいになってしまいます。 こんな時、"virtual" をつけ、仮想関数といいます。