C++の仮想関数と純粋仮想関数の違いは何ですか?
C++の仮想関数と純粋仮想関数は多相性を実現するための手法だが、違いがある。
基底クラスで宣言され、派生クラスでオーバーライド可能な仮想関数は、オブジェクトの種類に応じて実行時に呼び出される適切な関数を可能にします。仮想関数は派生クラスでオーバーライドすることも、オーバーライドしないこともできます。派生クラスが仮想関数をオーバーライドしない場合、基底クラスの仮想関数実装が呼び出されます。
純粋仮想関数は、基本クラスで宣言されて実装されていない仮想関数で、関数本体は 0 に設定されています。純粋仮想関数は、派生クラスに実装を強制し、派生クラスは対応する実装を提供する必要があります。派生クラスが純粋仮想関数を実装していない場合、派生クラスも抽象クラスになり、インスタンス化できません。
各論点の相違は以下の通り。
- 仮想関数はデフォルト実装があり、派生クラスでオーバーライドできますが、純粋仮想関数にはデフォルト実装がなく、派生クラスで必ずオーバーライドする必要があります。
- 派生クラスでは仮想関数は任意にオーバーライドできるが、純粋仮想関数は必ずオーバーライドしなければならない。
- 純粋仮想関数を持つクラスは抽象クラスとなり、インスタンス化できない。虚数関数を持つクラスはインスタンス化できる。
- 仮想関数は実装されていてもされていなくてもよいが、純粋仮想関数は宣言のみで実装はされていない。
- 仮想関数は、基本クラスのポインタや参照を通じて呼び出すことができる。純粋仮想関数は、派生したクラスのインスタンスを通じてのみ呼び出すことができる。
多態を実現するために仮想関数と純粋仮想関数のどちらも使用されますが、純粋仮想関数は派生クラスが実装を提供しなければならないことをより強制します。