初めに
純粋仮想関数(pure virtual function)は、C++の抽象クラス(abstract class)を定義するために使用されます。純粋仮想関数を持つクラスはインスタンス化できず、そのクラスを基底クラスとして派生クラスで具体的な実装を提供することを期待します。
これから純粋仮装関数について解説します。
純粋仮想関数の定義
純粋仮想関数は次のように定義されます。関数宣言の末尾に = 0
を付けることで、その関数が純粋仮想関数であることを示します。
class Base {
public:
virtual void pureVirtualFunction() = 0; // 純粋仮想関数
};
抽象クラス
純粋仮想関数を1つ以上持つクラスは抽象クラスと呼ばれ、このクラスのオブジェクトを直接作成することはできません。派生クラスで純粋仮想関数をオーバーライドしない限り、派生クラスもまた抽象クラスになります。
具体的な例
以下に純粋仮想関数を使った例を示します。
#include <iostream>
class Shape {
public:
// 純粋仮想関数の定義
virtual void draw() = 0;
// 通常のメンバ関数
void info() {
std::cout << "This is a shape." << std::endl;
}
};
class Circle : public Shape {
public:
// 純粋仮想関数をオーバーライド
void draw() override {
std::cout << "Drawing a circle." << std::endl;
}
};
class Square : public Shape {
public:
// 純粋仮想関数をオーバーライド
void draw() override {
std::cout << "Drawing a square." << std::endl;
}
};
int main() {
// Shape shape; // エラー:抽象クラスのインスタンス化はできない
Circle circle;
Square square;
Shape* shapes[] = { &circle, &square };
for (Shape* shape : shapes) {
shape->draw(); // ポリモーフィズムの使用
}
return 0;
}
ポイント
-
抽象クラスのインスタンス化は不可: 抽象クラスそのもののインスタンスを作成することはできません。上記の例で
Shape shape;
としようとするとコンパイルエラーになります。 -
派生クラスでのオーバーライド: 派生クラスは純粋仮想関数をオーバーライドして具体的な実装を提供する必要があります。派生クラスが純粋仮想関数をオーバーライドしない場合、その派生クラスも抽象クラスとなり、インスタンス化できません。
-
ポリモーフィズムの使用: 基底クラスのポインタまたは参照を使って、派生クラスのオーバーライドされた関数を呼び出すことができます。上記の例では、
Shape* shapes[]
配列を使ってCircle
とSquare
オブジェクトのdraw
メソッドを呼び出しています。
まとめ
純粋仮想関数は、抽象クラスを作成し、ポリモーフィズムをサポートするための重要な機能です。これにより、共通のインターフェースを定義し、派生クラスで具体的な実装を提供することができます。抽象クラスを使うことで、設計上の一貫性を保ちながら、柔軟なクラス階層を構築することが可能になります。