【C++】オブジェクト指向における「汎化」と「継承」の関係を解説

目次

はじめに

オブジェクト指向設計の初期段階では、システムに必要な「モノ」をクラスとして洗い出していきます。その過程で、複数の異なるクラスが、実は多くの共通した性質(データや操作)を持っていることに気づくことがあります。

この、「複数のクラスに共通する部分を抽出し、より上位の一般的なクラスとしてまとめる」という設計上の考え方を「汎化 (Generalization)」と呼びます。

そして、この汎化という設計アイデアを、C++などのプログラミング言語の「継承 (Inheritance)」という仕組みを使ってコードに落とし込むことで、コードの重複をなくし、再利用性の高い構造を作り上げることができます。

この記事では、「役員」「部長」「営業担当」という3つのクラスを例に、汎化と継承の考え方を実践的に解説します。


汎化と継承を使わない場合のコード

まず、汎化と継承の考え方を使わずに、3つのクラスを個別に定義してみましょう。

問題点のあるコード

#include <iostream>
#include <string>

using namespace std;

// 3つのクラスを個別に定義
class Executive {
public:
    int id;
    string name;
    long salary;
    // Executive独自のメンバ
    int stockOptions;
};

class DepartmentHead {
public:
    int id;
    string name;
    long salary;
    // DepartmentHead独自のメンバ
    long expenseAccount; // 交際費
};

class Salesperson {
public:
    int id;
    string name;
    long salary;
    // Salesperson独自のメンバ
    long salesTarget; // 売上目標
};

// ... main関数でそれぞれ利用 ...

問題点: id, name, salary という3つのメンバ変数が、全てのクラスで**重複(重複)**しています。もし、idstring 型に変更したくなったら、3つのクラス全てを修正する必要があり、手間がかかり、ミスの原因にもなります。


汎化と継承を使った改善後のコード

次に、「役員も、部長も、営業担当も、皆『社員』である」という共通点に着目し、「社員」という汎化された親クラスを作成し、それを継承します。

完成コード

#include <iostream>
#include <string>

using namespace std;

// --- 1. 汎化: 共通部分を抜き出した親クラスを作成 ---
class Employee {
public:
    int id;
    string name;
    long salary;
    
    void showCommonInfo() {
        cout << "社員番号: " << id << endl;
        cout << "氏名: " << name << endl;
        cout << "給与: " << salary << "円" << endl;
    }
};

// --- 2. 継承: Employeeクラスを継承して、各役職クラスを作成 ---
class Executive : public Employee {
public: 
    int stockOptions;
};

class DepartmentHead : public Employee {
public :
    long expenseAccount;
};

class Salesperson : public Employee {
public:
    long salesTarget;
};


int main() {
    Executive exec;
    exec.id = 101;
    exec.name = "鈴木 一郎";
    exec.salary = 20000000;
    exec.stockOptions = 5000;
    
    cout << "--- 役員情報 ---" << endl;
    exec.showCommonInfo(); // 親クラスから継承したメソッド
    cout << "ストックオプション: " << exec.stockOptions << "株" << endl;
    
    return 0;
}

コードの解説とメリット

汎化 (Generalization)

Executive, DepartmentHead, Salesperson の3つのクラスに共通していた id, name, salary というメンバを抽出し、それらをまとめた Employee(社員)という、より一般的で抽象的なクラスを設計しました。これが汎化のプロセスです。

継承 (Inheritance)

class Executive : public Employee のように、汎化によって作成された Employee クラスを親クラス(基底クラス)として継承することで、Executive などの子クラス(派生クラス)は、idname などのメンバを自分で定義することなく利用できるようになります。

メリット

  • コードの重複排除: 共通のメンバは親クラス Employee に一元管理されるため、コードが簡潔になります。
  • 保守性の向上: もし id の型を変更する必要が出ても、修正箇所は Employee クラスの一箇所だけで済みます。
  • 再利用性の向上: Employee クラスは、今後「経理担当」や「人事担当」といった新しいクラスを作成する際にも、親クラスとして再利用できます。

サイトアイコン

まとめ

今回は、オブジェクト指向設計における「汎化」の考え方と、それをコードで実現する「継承」の仕組みについて解説しました。

  • 汎化: 複数のクラスから共通点を見つけ出し、親クラスとしてまとめるという設計思想。
  • 継承: 汎化された親クラスの機能を引き継ぎ、コードの再利用性を高めるプログラミングの仕組み。

オブジェクト指向設計の第一歩は、必要なクラスを洗い出し、それらの関係性を見極めて、汎化と継承によって整理・構造化することです。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次