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