オブジェクト指向プログラミングにおいて、あるクラスが、ほかのクラスの性質(メンバ)を引き継いでいること、あるいは引き継ぐことをいいます。
継承の元になっているほうのクラスをスーパークラス、引き継ぎ先のクラスをサブクラスと呼びます。また、サブクラスを作り出すことをサブクラス化と呼びます。
サブクラスには、スーパークラスが持つ性質を引き継いだうえで、新たな性質(メンバ)を加えることができます。これは、違いがある部分だけを書き足せばいいということでもあり、同じソースコードを繰り返し記述する必要がなくなり、重複を防ぐ効果があります(差分プログラミング)。また、仮想メソッドをサブクラス側でオーバーライドすることで、メソッドの内容を変更できます。この機能は、多態性を実現する手段になります。
通常、スーパークラスは抽象的・汎用的な作りであり、サブクラスはより具体化された作りになるのが適切です(汎化と特化)。つまり、スーパークラスのオブジェクトが使われている箇所を、サブクラスのオブジェクトを使うように置き換えたとしても、意味合いが変化しないことが望ましいといえます(リスコフの置換原則)。そのため、オーバーライドによってメソッドの動作を変更できるにしても、スーパークラス側でのそのメソッドの意味合いを変えてしまうことは不適切であるといえます。
C++ など一部のプログラミング言語では、元になるクラスが2つ以上ある多重継承が可能です(対比として、元になるクラスが1つである通常の継承を、単一継承と呼ぶ)。ただし多重継承は、異なる2つ以上のスーパークラスが、共通の祖先(さらに上位に来るスーパークラス)を持つような複雑な継承構造を生み出してしまうことがあり、祖先のメンバを重複して引き継いでしまったり、メンバの名前が衝突したりするなど、活用に難があります。多重継承の便利で安全な部分だけを活用するために、インターフェースや mixin といった方法を用いたりすることがあります。
C++ は継承に関するバリエーションが豊かで、単一継承と多重継承が可能であるほか、メンバへのアクセス範囲を細かく制御する機能(継承時にアクセス指定子を付加する)を持ちます。また、多重継承の菱形継承問題を解決する方法として、仮想継承と呼ばれる方法があります。
継承についての解説が、C++編【言語解説】第28章、第29章、第30章にあります。
なお用語として、C++ では、スーパークラスのことを基底クラス、サブクラスのことを派生クラスと呼びます。また、継承という用語を「クラスのメンバを引き継ぐ」という意味であり、「クラスを引き継ぐ」ことと区別されています。クラスどうしの関係性をいうのであれば派生 (derived) という用語を用いて「クラスD はクラスB から派生される」といった言い方をします。[1]
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |