継承とは
この記事ではオブジェクト指向を構成する三要素の一つである継承について解説します。
オブジェクト指向についてはオブジェクト指向とはを参照。
継承とはあるクラスから機能を拡張した別のクラスを作ることを指します。
汎用的なクラスを作って再利用することで作業工数を減らすことがよくあります。
しかし、全てのプログラムで汎用的なクラスがそのまま使えるわけではないでしょう。
そこで汎用的なクラスの持つメンバを元に異なる部分だけを変更したクラスを定義します。
継承の元になるクラスを親クラスまたは基本クラス、親クラスから派生したクラスを子クラスまたは派生クラスと呼びます。
クラスを継承させることをクラスを派生させるとも言います。
継承の使い方
継承によって派生クラスを定義するには以下のように記述します。
class 【派生クラス名】 : 【アクセスコントロール】 【基本クラス名】 { 【追加するメンバ】; }
基本的なクラスの宣言にアクセスコントロールと基本クラスを指定します。
アクセスコントロールについては後述します。
クラスの定義内には、基本クラスには無い、派生クラスから新たに用意したメンバのみを記述します。
基本クラスにある大量のメンバを記述する手間を省くことが出来ます。
また、基本クラスのメンバ関数を上書きして別の処理をさせることもできます。
これについても後ほど詳しく解説します。
派生クラスのアクセスコントロール
クラスを派生させる際にアクセスコントロールを指定する必要がありますが、その前に一つ新しいアクセスコントロールを覚えましょう。
public、privateのほかにprotectedと言うアクセスコントロールがあります。
protectedはそのメンバが定義されているクラスのメンバと、そのクラスの派生クラスからのみアクセスできます。
publicとprivateの中間と覚えれば良いでしょう。
このような、メンバそれぞれに与えられるアクセスコントロールとクラスの派生時に設定するアクセスコントロールの組み合わせによってアクセスできるかどうかが変化します。
組み合わせを表にまとめました。
派生クラスのアクセスコントロール | ||||
public | protected | private | ||
メンバのアクセスコントロール | public | public | protected | private |
protected | protected | protected | private | |
private |
縦軸にはメンバのアクセスコントロール、つまり基本クラスのメンバ定義の際に設定したアクセスコントロールです。
横軸は派生するときのアクセスコントロールなので継承の際に設定したものになります。
表の各要素の中には、各組み合わせで設定した場合、派生クラスで定義したことになるアクセスコントロールを示します。
例えばメンバのアクセスコントロールと派生クラスのアクセスコントロールが共にpublicの場合、派生クラス内でpublicを指定したことになります。
すなわち、派生クラスを更に派生させる際のメンバのアクセスコントロールになります。
まず、基本クラスでprivateを設定したメンバは派生クラスからもアクセスすることが出来ません。
なので全て空欄になっています。
それ以外は、より制限の強い方に合わせると考えて問題ないでしょう。