カテゴリー
C++

クラスの継承について知ろう

次はクラスの継承について説明します。
「クラスの継承」とは親クラス(元のクラス)の他に「もう1つの関連したクラス」を作る時に親クラスのデータメンバやメンバ関数を引き継ぐことを言います。
「もう1つの関連したクラス」のことを子クラスもしくはサブクラスといいます。
親クラスと同じデータメンバやメンバ関数を子クラスで定義しなくてはいけない時、親クラスと同じデータメンバやメンバ関数を子クラスで再度記述する必要がなくなります。
つまり、親クラスと同じ機能を持つデータメンバやメンバ関数を子クラスで使う時に、改めて同じデータメンバやメンバ関数を子クラスで書くのは無駄ですので、そのような時にクラスの継承を使います。
また、子クラスには子クラス独自のデータメンバやメンバ関数も追加することもできます。
注意してほしいことは全く違うクラス同士を継承しても意味が無いと言うことです。
例えば銀行クラスと自動車クラスは全く違うクラスなので、継承関係にしても意味ありません(意味があればいいですが)。
継承関係が正しいかどうか悩む場合には「子クラスは親クラスの子供である」という文の「子クラス」「親クラス」に自身で作ったクラス名を当てはめてみて、違和感がないようでしたらそれは正しい継承関係です。
「銀行クラスは自動車クラスの子供である」と聞いてもおかしいと思いませんか?
違和感があるようでしたらそれは意味が無い継承です。
では継承の例を見てみましょう。11111111 では説明に入ります。
クラスの継承の基本構文は以下の通り書きます。1 この例では以下の箇所が継承クラスの箇所です。1111
ここで継承クラスのポイントを説明します。
[ポイント1]
子クラスでは親クラスのデータメンバやメンバ関数を受け継いでいるので、親クラスのメンバを使うことが出来ます。
この例では子クラスのオブジェクトから親クラスのメンバ関数に以下のようにアクセスしています(親クラスのメンバをすべて使用する必要はありません)。1 子クラスではdeposit関数を定義していないにも関わらずdeposit関数を使うことができるのが継承の意味です。
つまり、子クラスではprivate指定以外の親クラスのデータメンバやメンバ関数をすべて使うことが出来ます。
[ポイント2]
子クラスの引数のないオブジェクト1を作成した時には先に親クラスの「引数の無いコンストラクタ」が実行されてから小クラスのコンストラクタが実行されますので初めに実行されるには以下の親クラスのコンストラクタです。
この記述で親クラスのデータメンバにデータを入れているので、子クラスで親クラスのデータメンバを使うことが出来ます。
親クラスの引数の無いコンストラクタが実行された後に、子クラスの「引数の無いコンストラクタ」が実行されます。1 [ポイント3]1 親クラスの定義の中に上の記述がありますが, 親クラスのメンバがprotectedで指定されている場合は子クラスの中で、そのデータメンバやメンバ関数にアクセスできます。
以下のように親クラスでprivate指定してしまうと子クラスからはアクセスすることが出来なくなります。1 [ポイント4]
次は親クラスと小クラスで同じ名前のメンバ関数を定義した場合、どのような動きになるか見てみましょう。
この例では以下の部分で親クラスと子クラスで同じ関数名が使われています。1 親クラスと子クラスでは関数名も引数の数や型も同じ関数を作ることが出来ます(メソッドの中身はそれぞれのクラスの内容に合わせます)。
このことをオーバーライドと言います。
この例の場合、子クラスのオブジェクトから1のようにgetPoint関数を呼び出していますが、子クラスで定義された関数のほうが優先して呼び出されることになります。
この例の結果は以下の通りです。1