ウィンドウクラスで次の関数定義を見つけたとき、Windows APIをラップする(名前を付けないことが望ましい)GUIツールキットのソースを参照していた。
virtual LRESULT CALLBACK wndProc (HWND, UINT, WPARAM, LPARAM) = 0;
ここで何が起きてるの?どのようにして関数を整数に割り当てることができますか?それともNULL
に割り当てますか? wndprocで関数ポインターを使用したい場合、これを行う必要がありますか?
そのコード行は、C++で純粋仮想関数を定義します。それは一般にさもなければトリッキーなWin32 APIまたはGUIコードとは何の関係もありません。
純粋仮想関数は、クラスの設計者が派生クラスに関数をオーバーライドして独自の実装を提供させたい場合に使用される仮想関数です。
クラスに純粋な仮想関数が含まれている場合、そのクラスは「抽象」クラスと見なされ、そのクラスのインスタンスはインスタンス化できません。
C++は特別な構文= 0;
を使用して、新しいキーワードを言語に追加する代わりに(C#のような言語のように)純粋な仮想関数を示します。関数ポインタを0に設定すると考えることができます。
この関連する質問への回答も参照してください: C++での純粋仮想関数の用途は何ですか?
(ちなみに、Windowsヘッダーファイル<windows.h
>はNULL
を0と定義するだけです。したがって、プログラマーは技術的にできます= NULL
と書かれていますが、数値定数0を使用し、ポインタ値用にNULL
を予約する方がはるかに明確です。
純粋仮想関数です。
=0
は、純粋な仮想関数であることを示すために使用される構文にすぎません。
クラスにPure仮想関数が存在すると、そのクラスはAbstract classになります。抽象クラスのオブジェクトを作成することはできません。ただし、そのような抽象クラスへのポインタまたは参照を作成できます。派生クラスはそのメソッドをオーバーライドする必要があります。
関数を純粋仮想化する目的は何ですか?
通常、Abstract Baseクラスの設計者が派生クラスを強制してその関数をオーバーライドし、独自の実装を提供できるように、関数は純粋に仮想化されます。ただし、純粋仮想関数は独自の実装を持つことができるため、派生クラスは関数の基本クラスバージョンを呼び出すことができることに注意してください。
基本クラスを抽象化するためだけに純粋な仮想関数が追加される場合があります(そのため、インスタンスを作成できません)。通常、このような状況では、ダミー関数を追加してクラスを抽象化する代わりに、クラスのデストラクタを純粋に仮想化します。
これは、派生クラスでオーバーライドする必要がある " pure virtual "関数です。