はじめに
オブジェクト指向プログラミングの三本柱の一つである「継承 (Inheritance)」は、既にあるクラスの機能(メンバ変数やメンバ関数)を受け継いで、新しいクラスを定義するための強力な仕組みです。
例えば、「乗り物」という基本的なクラスがあれば、それを継承して「車」クラスや「飛行機」クラスを作ることができます。「車」も「飛行機」も「前に進む」という「乗り物」の基本機能は共通して持っていますが、それぞれが独自の機能(例: 「車」はバックする、「飛行機」は飛行する)を追加できます。
これにより、コードの重複を避け、プログラムの再利用性と拡張性を劇的に高めることができます。この記事では、C++におけるクラス継承の基本的な使い方を解説します。
クラスの継承のサンプルコード
このコードは、基本的な情報を扱う Vehicle
(乗り物)という親クラスを定義し、そのクラスを継承して、より専門的な情報を持つ Truck
(トラック)という子クラスを作成します。
完成コード
#include <iostream>
using namespace std;
// --- 1. 親クラス(基底クラス)の定義 ---
class Vehicle {
private:
int id;
double fuel;
public:
Vehicle();
void setVehicle(int i, double f);
void show();
};
// 親クラスのコンストラクタ
Vehicle::Vehicle() {
id = 0;
fuel = 0.0;
cout << "乗り物が作成されました。" << endl;
}
// 親クラスのメンバ関数
void Vehicle::setVehicle(int i, double f) {
id = i;
fuel = f;
cout << "IDを" << id << "に、燃料を" << fuel << "にしました。" << endl;
}
void Vehicle::show() {
cout << "ID: " << id << endl;
cout << "燃料: " << fuel << "リットル" << endl;
}
// --- 2. 子クラス(派生クラス)の定義 ---
// Vehicleクラスのpublicなメンバを継承
class Truck : public Vehicle {
private:
int payload; // 積載量
public:
Truck();
void setPayload(int p);
void show(); // 親クラスのshow()をオーバーライド
};
// 子クラスのコンストラクタ
Truck::Truck() {
payload = 0;
cout << "トラックが作成されました。" << endl;
}
// 子クラス独自のメンバ関数
void Truck::setPayload(int p) {
payload = p;
cout << "積載量を" << payload << "kgにしました。" << endl;
}
// 子クラスでオーバーライドしたメンバ関数
void Truck::show() {
Vehicle::show(); // 親クラスのshow()を呼び出す
cout << "積載量: " << payload << "kg" << endl;
}
int main() {
// --- 3. 子クラスのオブジェクトを作成して使用 ---
Truck myTruck;
// 親クラス(Vehicle)から継承したメンバ関数を呼び出す
myTruck.setVehicle(1234, 50.5);
// 子クラス(Truck)独自のメンバ関数を呼び出す
myTruck.setPayload(1000);
cout << "\n--- トラックの情報を表示 ---" << endl;
// 子クラスでオーバーライドしたメンバ関数を呼び出す
myTruck.show();
return 0;
}
コードの解説
1. 親クラスと子クラス
- 親クラス (
Vehicle
): 継承の元となるクラスです。「基底クラス」や「スーパークラス」とも呼ばれます。 - 子クラス (
Truck
): 親クラスの機能を引き継いで作られる新しいクラスです。「派生クラス」や「サブクラス」とも呼ばれます。
2. class Truck : public Vehicle
これが、継承を行うための構文です。
class Truck
: 新しく定義する子クラスの名前です。:
: コロンに続けて、継承する親クラスを指定します。public Vehicle
:Vehicle
クラスをpublic継承するという意味です。public
継承を行うと、親クラスのpublic
なメンバは、子クラスでもpublic
なメンバとして引き継がれます。親クラスのprivate
なメンバは、子クラスから直接アクセスすることはできません。
3. 継承されたメンバの利用
Truck
クラスは、Vehicle
クラスを継承しているため、Truck
オブジェクト(myTruck
)は、あたかも自分自身のメンバであるかのように、Vehicle
クラスのpublic
なメンバ関数 setVehicle()
を自由に呼び出すことができます。
同時に、Truck
クラスで独自に追加したメンバ関数 setPayload()
も利用できます。このように、子クラスは親クラスの機能と独自の機能の両方を併せ持つことができます。
まとめ
今回は、C++におけるクラスの「継承」の基本を解説しました。
- 継承は、既存のクラスの機能を再利用して、新しいクラスを作る仕組み。
class 子クラス名 : public 親クラス名
という構文で定義する。- 子クラスは、親クラスの
public
なメンバを、自分のものとして利用できる。
継承は、オブジェクト指向におけるコードの再利用性を高めるための中心的な機能です。共通の機能を親クラスにまとめ、個別の機能を子クラスに持たせることで、効率的で拡張しやすいプログラムを設計できます。