●学校情報

講座一覧・募集状況

学習方法

学習サポート

修了生の評価

受講生の横顔

当学院について

入学相談

入学手続

 

●講座情報

技術者養成講座

プログラミング講座

WEB講座

情報処理試験講座

Excel講座

Access講座

 

●関連コラム

関連コラム

関連用語集

 

logo

 

 

関連用語集

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;
}

このように、抽象クラス Shapedraw() というインターフェースだけを定義し、具体的な処理は子クラス(CircleSquare)で定義されています。

抽象クラスを使うメリット

  1. 共通インターフェースを定義できる
    複数のクラスで統一された操作を保証できる。
  2. 実装の強制ができる
    子クラスに必ず関数を定義させることができる。
  3. ポリモーフィズムが活用できる
    親クラスのポインタで子クラスの機能を動的に呼び出せる。

注意点

  • 抽象クラス自体からはインスタンスを作れません。
  • すべての純粋仮想関数を子クラスでオーバーライドしないと、子クラスも抽象クラスになります。
  • 抽象クラスはポインタや参照で扱うのが基本です。

抽象クラスとインターフェースの違い

C++には「インターフェース」という明確な構文はありませんが、すべての関数が純粋仮想関数で、メンバ変数を持たない抽象クラスを「インターフェース」として扱うことが一般的です。

まとめ

C++の抽象クラスは、複数の派生クラスに共通のルールや操作を定義するための強力な設計ツールです。 純粋仮想関数と組み合わせることで、柔軟かつ安全なプログラム設計が可能になります。

まずは抽象クラスを使って、複数のクラスを共通のインターフェースで扱う体験をしてみましょう!

 

C++関連用語集

−−−−−  C++  −−−−−

C++のクラス(Class)とは?仕組みと使い方をわかりやすく解説!

C++のオブジェクト(Object)とは?クラスとの関係と役割をわかりやすく解説!

C++のコンストラクタ(Constructor)とは?役割と使い方をやさしく解説!

C++のデストラクタ(Destructor)とは?役割と使い方をやさしく解説!

C++の継承(Inheritance)とは?クラスを拡張する基本テクニック

C++の多態性/ポリモーフィズム(Polymorphism)とは?オブジェクト指向の真髄を解説!

C++のオーバーロード(Overload)とは?関数や演算子を便利に使い分けよう!

C++のオーバーライド(Override)とは?継承と仮想関数の正しい使い方

C++の仮想関数(Virtual Function)とは?ポリモーフィズムを実現する仕組みを解説!

C++の純粋仮想関数(Pure Virtual Function)とは?抽象クラスとの関係も解説!

C++の抽象クラス(Abstract Class)とは?使い方と役割をわかりやすく解説!

C++のテンプレート(Template)とは?型に依存しない汎用的な関数・クラスを作ろう!

C++の名前空間(Namespace)とは?名前の衝突を防ぐ便利な機能

C++の標準テンプレートライブラリ(STL)とは?効率的な開発に必須のライブラリ群

C++のベクター(vector)とは?配列より便利なSTLコンテナを使いこなそう!

C++のイテレータ(Iterator)とは?STLコンテナを自在に操作する鍵

C++の参照(Reference)とは?ポインタとの違いもわかりやすく解説!

C++のポインタ(Pointer)とは?メモリを操る強力な機能をやさしく解説!

C++の動的メモリ確保(Dynamic Memory Allocation)とは?newとdeleteを使いこなそう

C++のnew/delete演算子とは?動的メモリ確保の基本をマスターしよう!

C++の例外処理(Exception Handling)とは?try/catch/throwでエラーに強いプログラムを作ろう

C++のtry/catch構文とは?例外処理の基本をやさしく解説!

C++のRAIIとは?リソース管理を自動化する重要な設計原則

C++の静的変数(static variable)とは?使い方・特徴・注意点をやさしく解説!

C++の関数ポインタ(Function Pointer)とは?使い方と活用例をわかりやすく解説!

C++のラムダ式(Lambda Expression)とは?書き方・使い方をやさしく解説!

C++のスマートポインタ(Smart Pointer)とは?自動で安全なメモリ管理を実現しよう!

C++のコンパイル(Compile)とは?仕組みと流れをわかりやすく解説!

C++のリンク(Link)とは?コンパイルとの違いとエラー対策を解説!

C++のプリプロセッサディレクティブとは?#include や #define の意味と使い方