C++/純粋仮想関数
< C++
純粋仮想関数の概要
編集純粋仮想関数とは、さらに具体的な実装を派生クラスに求める関数を指します。純粋仮想関数を1つでも含むクラスは抽象クラスと呼ばれ、そのままでは直接インスタンスを生成できません。抽象クラスの目的は、共通のインターフェースを定義することにあります。
純粋仮想関数の定義方法
編集純粋仮想関数は、virtual
キーワードに加えて= 0
を付けることで宣言します。
class Shape { public: virtual double getArea() = 0; // 純粋仮想関数 };
抽象クラスのデストラクタは、たとえ本体がないとしても、純粋仮想化する必要があります。
class Shape { public: virtual ~Shape() = 0; // 純粋仮想デストラクタ };
純粋仮想関数の継承
編集派生クラスは、基底クラスの純粋仮想関数をオーバーライドすることで、抽象クラスの具象化を行います。
class Circle : public Shape { double radius; public: Circle(double r) : radius{r} {} virtual double getArea() override { return 3.14 * radius * radius; } };
抽象クラスとポリモーフィズム
編集純粋仮想関数により定義されたインターフェースを介して、基底クラスのポインタや参照を使うことで、ポリモーフィックな振る舞いを実現できます。
Shape* shapes[] = { new Circle(5), new Rectangle(3, 4) }; for (Shape* s : shapes) { cout << s->getArea() << endl; // 派生クラスの該当する関数が呼び出される }
抽象クラスの使用例
編集グラフィックスライブラリでは、Shape
のような抽象クラスから様々な具象クラスを派生させ、描画やヒットテストなどの機能を提供します。ファイル入出力ライブラリでは、std::ios_base
が抽象クラスとして定義され、std::ifstream
やstd::ofstream
がそこから派生しています。
総合問題
編集まとめ
編集純粋仮想関数を含む抽象クラスは、共通のインターフェースを定義するためのクラス設計の重要な要素です。抽象クラスから具象クラスを適切に派生させることで、ポリモーフィックな振る舞いを実装できます。純粋仮想関数は、C++のオブジェクト指向の柱の一つとなっています。今後、デザインパターンなどを学ぶことで、抽象クラスの活用がさらに広がるでしょう。