C++の純粋仮想関数(Pure Virtual Function)とは?抽象クラスとの関係も解説!
C++のオブジェクト指向プログラミングでは、「共通のインターフェース」を定義する手段として純粋仮想関数(Pure Virtual Function)が用いられます。
これは、派生クラス(子クラス)で必ずオーバーライドされるべき関数を定義するための仕組みです。
この記事では、純粋仮想関数の意味や使い方、抽象クラスとの関係について初心者にもわかりやすく解説します。
純粋仮想関数とは?
純粋仮想関数とは、関数の本体(処理内容)を持たず、「= 0」を使って宣言だけ行う仮想関数のことです。
この関数は、必ず子クラスでオーバーライド(上書き)されることを前提としています。
基本構文
class クラス名 {
public:
virtual 戻り値 関数名(引数) = 0; // 純粋仮想関数
};
「= 0
」をつけることで純粋仮想関数であることを示します。処理内容は書きません。
使用例
#include <iostream>
using namespace std;
// 抽象クラス(純粋仮想関数を持つ)
class Animal {
public:
virtual void speak() = 0; // 純粋仮想関数
};
// 派生クラス
class Dog : public Animal {
public:
void speak() override {
cout << "ワンワン!" << endl;
}
};
int main() {
Animal* pet = new Dog();
pet->speak(); // ワンワン!
delete pet;
return 0;
}
この例では、Animal
クラスが純粋仮想関数 speak()
を持つことで、「必ず speak を実装する必要がある」というルールを作っています。
抽象クラスとは?
純粋仮想関数を1つ以上含むクラスは「抽象クラス(Abstract Class)」になります。
抽象クラスは直接インスタンス化(オブジェクトの生成)することはできません。
Animal a; // エラー!抽象クラスのオブジェクトは作れない
抽象クラスは、共通のインターフェースとしての役割を持ち、派生クラスに具体的な処理を任せる設計に使われます。
純粋仮想関数の活用シーン
- 異なる種類のクラスに共通の処理を定義したいとき
- 「実装を強制したい」関数があるとき
- プラグインや拡張機能の共通基盤として
注意点
- 純粋仮想関数があると、そのクラスはインスタンス化できない(抽象クラスになる)
- すべての派生クラスでその関数を必ず定義しなければならない
- 抽象クラスはポインタや参照で扱うのが基本
まとめ
C++の純粋仮想関数は、「共通のルール」をクラス間で定義するための強力な仕組みです。
抽象クラスとともに使うことで、継承関係にある複数のクラスに一貫性と拡張性をもたせることができます。
オブジェクト指向らしい柔軟な設計を行うために、まずは簡単な純粋仮想関数を使って設計を試してみましょう!