純粋仮想関数 (ジュンイスイカソンカン スウ) とは | 意味や読み方など丁寧でわかりやすい用語解説

作成日: 更新日:

純粋仮想関数 (ジュンイスイカソンカン スウ) の読み方

日本語表記

純粋仮想関数 (ジュンイスイカソウカンシュウ)

英語表記

pure virtual function (ピュアバーチャルファンクション)

純粋仮想関数 (ジュンイスイカソンカン スウ) の意味や用語解説

純粋仮想関数とは、オブジェクト指向プログラミングにおいて、基底クラスで具体的な実装を持たず、派生クラスでの実装を強制するために定義される特別な仮想関数のことである。主にC++のような言語で利用され、クラスの抽象度を高め、共通のインターフェースを定義する目的で用いられる。純粋仮想関数を一つでも持つクラスは「抽象クラス」と呼ばれ、そのクラス自体はインスタンスを直接生成することができない。抽象クラスは、具体的な処理内容を定義するのではなく、「何ができるべきか」という振る舞いの骨格や「契約」を定める設計図のような役割を果たす。 詳細について説明する。純粋仮想関数が必要となるのは、複数の異なるクラスが共通の機能を持つが、その機能の具体的な処理内容が各クラスによって大きく異なる、または基底クラスの段階では決定できない場合である。例えば、様々な図形を扱うプログラムを考える場合、「図形」を表す基底クラス(Shape)を作成し、その下には「円」(Circle)や「長方形」(Rectangle)といった派生クラスが存在する。ここで、全ての図形に「面積を計算する」という機能(calculateArea)を持たせたいと考える。しかし、基底クラスであるShapeの段階では、具体的な図形の種類が定まっていないため、面積をどのように計算すればよいか決定できない。このような状況で、ShapeクラスにcalculateArea関数を純粋仮想関数として定義する。これにより、Shapeクラスを継承する全ての派生クラスは、必ずcalculateArea関数をそれぞれの図形に適した方法で実装しなければならない、という制約が課されることになる。 C++において、純粋仮想関数は関数の宣言の末尾に「`= 0`」を付加することで定義する。例えば、`virtual double calculateArea() = 0;` のようになる。この`= 0`は、「この関数には実装がなく、派生クラスで必ず実装する必要がある」ということをコンパイラに伝える役割を持つ。純粋仮想関数が定義されたクラスは抽象クラスとなり、その抽象クラスのオブジェクトを直接生成しようとすると、コンパイル時にエラーが発生する。抽象クラスはあくまでインターフェースの定義であり、具体的な振る舞いを記述するものではないため、具体的なオブジェクトとしては存在できないからである。派生クラスが抽象クラスから継承した場合、その派生クラスが基底クラスの全ての純粋仮想関数をオーバーライドして実装しない限り、その派生クラス自身も抽象クラスとして扱われ、やはりインスタンス化はできない。最終的に全ての純粋仮想関数が実装された派生クラスのみが、具体的なオブジェクトとしてインスタンス化可能となる。 純粋仮想関数を用いることの最大のメリットは、プログラムの設計における一貫性と拡張性を高める点にある。まず、インターフェースの強制により、同じ基底クラスから派生した全てのクラスが、特定の共通機能を確実に持つことを保証できる。これにより、異なる派生クラスのオブジェクトに対しても、基底クラスのポインタや参照を通じて共通の関数を呼び出す「ポリモーフィズム(多態性)」を実現しやすくなる。例えば、`Shape* myShape = new Circle();` とした後に `myShape->calculateArea();` と呼び出せば、Circleクラスで実装された面積計算が実行される。これは、プログラムの柔軟性を高め、新しい種類の図形が追加された場合でも、既存のコードに大きな変更を加えることなく対応できることを意味する。また、設計の段階で「どのような振る舞いを期待するか」を明確にできるため、大規模なプロジェクトにおける開発者間の役割分担やコミュニケーションを円滑にする効果もある。 通常の仮想関数と純粋仮想関数には違いがある。通常の仮想関数は、基底クラスにデフォルトの実装を持つことができ、派生クラスでオーバーライドすることも、しなくてもよい。デフォルトの実装があるため、通常の仮想関数を持つクラスはインスタンス化可能である。これに対し、純粋仮想関数は基底クラスに実装を持たず、派生クラスでの実装が必須であるため、純粋仮想関数を持つクラスはインスタンス化できない。純粋仮想関数は、完全に抽象的なインターフェースを定義する場合に用いられ、具体的な処理は全て派生クラスに委ねる、という強い意図が込められている。 純粋仮想関数は、フレームワークの設計やライブラリの作成など、将来的に多様な利用方法が想定されるシステムにおいて、共通の動作規約を定める際に特に有効である。例えば、プラグインアーキテクチャを持つアプリケーションで、基底となるプラグインインターフェースに純粋仮想関数を定義し、具体的なプラグイン開発者にその実装を委ねる、といった利用方法がある。また、デストラクタを純粋仮想関数として定義することも可能だが、多態的な削除を確実に行うためには、たとえ純粋仮想デストラクタであっても、その実装を定義する必要がある点には注意が必要である。C++以外のオブジェクト指向言語では、「抽象メソッド」や「インターフェース」といった類似の概念が提供されており、純粋仮想関数が実現する抽象化の考え方は、現代のソフトウェア開発において広く普及している重要な設計要素の一つである。

純粋仮想関数 (ジュンイスイカソンカン スウ) とは | 意味や読み方など丁寧でわかりやすい用語解説