C++の抽象クラス(Abstract Class)とは?使い方と役割をわかりやすく解説!
C++では、複数のクラスで共通する「機能の枠組み(インターフェース)」を定義したいときに、抽象クラス(Abstract Class)という仕組みを使います。
これは「中身のない関数(=純粋仮想関数)」を含んだクラスのことで、派生クラス(子クラス)で具体的な実装を強制するために使います。
この記事では、抽象クラスの意味や使い方、メリットと注意点について初心者にもわかりやすく解説します。
抽象クラスとは?
抽象クラスとは、少なくとも1つ以上の純粋仮想関数(virtual 戻り値 関数名() = 0)を含むクラスのことです。
このクラスは直接インスタンス(オブジェクト)を作ることはできません。
基本構文
class クラス名 {
public:
virtual void 関数名() = 0; // 純粋仮想関数(抽象クラスになる)
};
このように、= 0
を付けた仮想関数を含むと、そのクラスは抽象クラスとなります。
抽象クラスの例
#include <iostream>
using namespace std;
// 抽象クラス
class Shape {
public:
virtual void draw() = 0; // 純粋仮想関数
};
// 派生クラス
class Circle : public Shape {
public:
void draw() override {
cout << "円を描きます。" << endl;
}
};
class Square : public Shape {
public:
void draw() override {
cout << "四角を描きます。" << endl;
}
};
int main() {
Shape* s1 = new Circle();
Shape* s2 = new Square();
s1->draw(); // 円を描きます。
s2->draw(); // 四角を描きます。
delete s1;
delete s2;
return 0;
}
このように、抽象クラス Shape
は draw()
というインターフェースだけを定義し、具体的な処理は子クラス(Circle
や Square
)で定義されています。
抽象クラスを使うメリット
- 共通インターフェースを定義できる
複数のクラスで統一された操作を保証できる。
- 実装の強制ができる
子クラスに必ず関数を定義させることができる。
- ポリモーフィズムが活用できる
親クラスのポインタで子クラスの機能を動的に呼び出せる。
注意点
- 抽象クラス自体からはインスタンスを作れません。
- すべての純粋仮想関数を子クラスでオーバーライドしないと、子クラスも抽象クラスになります。
- 抽象クラスはポインタや参照で扱うのが基本です。
抽象クラスとインターフェースの違い
C++には「インターフェース」という明確な構文はありませんが、すべての関数が純粋仮想関数で、メンバ変数を持たない抽象クラスを「インターフェース」として扱うことが一般的です。
まとめ
C++の抽象クラスは、複数の派生クラスに共通のルールや操作を定義するための強力な設計ツールです。
純粋仮想関数と組み合わせることで、柔軟かつ安全なプログラム設計が可能になります。
まずは抽象クラスを使って、複数のクラスを共通のインターフェースで扱う体験をしてみましょう!