コンテンツにスキップ

C++/純粋仮想関数

出典: フリー教科書『ウィキブックス(Wikibooks)』
< 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::ifstreamstd::ofstreamがそこから派生しています。

総合問題[編集]

まとめ[編集]

純粋仮想関数を含む抽象クラスは、共通のインターフェースを定義するためのクラス設計の重要な要素です。抽象クラスから具象クラスを適切に派生させることで、ポリモーフィックな振る舞いを実装できます。純粋仮想関数は、C++のオブジェクト指向の柱の一つとなっています。今後、デザインパターンなどを学ぶことで、抽象クラスの活用がさらに広がるでしょう。