
比較表
比較基準 | 継承 | 多型 |
---|---|---|
基本 | 継承は、既存のクラスのプロパティを使って新しいクラスを作成することです。 | 多態性は、基本的には複数の形式に共通のインターフェースです。 |
実装 | 継承は基本的にクラスに実装されています。 | 多態性は基本的に関数/メソッドで実装されています。 |
つかいます | OOPでの再利用性の概念をサポートし、コードの長さを減らします。 | コンパイル時(オーバーロード時)および実行時(オーバーライド時)に、オブジェクトがどの形式の関数を呼び出すかを決定できるようにします。 |
フォーム | 継承は、単一継承、多重継承、多層継承、階層継承、およびハイブリッド継承です。 | ポリモーフィズムは、コンパイル時ポリモーフィズム(オーバーロード)またはランタイムポリモーフィズム(オーバーライド)のいずれかです。 |
例 | 「テーブル」は「家具」なので、クラス「テーブル」はクラス「家具」の機能を継承できます。 | クラス 'study_table'には関数 'set_color()'とクラス 'Dining_table'にも関数 'set_color()'を含めることができます。したがって、呼び出すときのset_color()関数の形式は、コンパイル時とコンパイル時の両方で決定できます。実行時 |
継承の定義:
継承はOOPの重要な機能の1つであり、「再利用性」を強くサポートします。 再利用可能性は、既存のクラスのプロパティを再利用して新しいクラスを作成することとして説明できます。 継承には、派生クラスによって継承される基本クラスがあります。 クラスが他のクラスを継承すると、基本クラスのメンバーは派生クラスのメンバーになります。
クラスを継承する一般的な形式は次のとおりです。
クラスの派生クラス名:アクセス指定子基本クラス名{//クラスの本体};
ここで、アクセス指定子は、基本クラス内のメンバーへのアクセスモード(private、public、protected)を派生クラスに提供します。 アクセス指定子が存在しない場合、デフォルトでは「プライベート」と見なされます。 C ++では、派生クラスが「struct」の場合、アクセス指定子はデフォルトで「public」です。
C ++では、継承は5つの形式で実現できます。 それらは次のように分類することができます -
- 単一継承(1つのスーパークラスのみ)
- 多重継承(いくつかのスーパークラス)
- 階層継承(1つのスーパークラス、多くのサブクラス)
- 多重継承(派生クラスから派生)
Javaでは、クラスはキーワード「extends」を使用して他のクラスを継承します。 Javaでは、基本クラスはスーパークラスと呼ばれ、派生クラスはサブクラスと呼ばれます。 サブクラスは、「プライベート」として宣言されている基本クラスのメンバーにアクセスできません。 Javaでクラスを継承する一般的な形式は次のとおりです。
class derived-class-nameはbase-class-name {//クラスの本体}を拡張します。
Javaは多重継承の継承をサポートしていませんが、多重階層をサポートしています。 Javaでは、スーパークラスが実装の詳細を隠したい場合があり、そのデータの一部を「非公開」にします。 Javaの場合と同様に、サブクラスはスーパークラスのプライベートメンバーにアクセスできず、サブクラスがそれらのメンバーにアクセスまたは初期化したい場合は、Javaがソリューションを提供します。 サブクラスは、キーワード「super」を使用して、その直接のスーパークラスのメンバーを参照できます。 覚えておいて、あなただけの直接のスーパークラスのメンバーにアクセスすることができます。
「スーパー」には2つの一般的な形式があります。 1つは、スーパークラスのコンストラクタを呼び出すために使用することです。 2つ目は、サブクラスのメンバーによって隠されているスーパークラスのメンバーにアクセスすることです。
//コンストラクタを呼び出す最初の形式 クラスsupper_class {supper_class(argument_list){..} //スーパークラスのコンストラクタ}; sub_classクラスはsupper_classを継承します。{sub_class(argument_list){..} // sub_classのコンストラクタsuper(argument_list); // sub_classはスーパークラスのコンストラクタを呼び出します}};
//「スーパー」クラスの2番目のクラスsupper_class {int i; sub_classクラスはsupper_classを拡張します。 sub_class(int a、int b){super.i = a; //スーパークラスi = bの 'i'。 //サブクラスの 'i'}};
多型の定義
多型という用語は、単に「1つの関数、複数の形式」を意味します。 多態性は、コンパイル時と実行時の両方で達成されます。 コンパイル時の多態性は「オーバーロード」によって実現されますが、実行時の多態性は「オーバーライド」によって実現されます。
多態性により、オブジェクトは、コンパイル時と実行時の両方で、「どの形式の関数をいつ呼び出すか」を決定できます。
過負荷の最初の概念について説明しましょう。 オーバーロードでは、異なるデータ型とパラメータ数を使用してクラス内に関数を複数回定義しますが、オーバーロードされる関数は同じ戻り型を持つ必要があります。 ほとんどの場合、オーバーロードされる関数はクラスのコンストラクタです。
クラスオーバーロード{int a、b;} public:int overload(int x){//最初のoverload()コンストラクタa = x; を返します。 } int overload(int x、int y){// 2番目のoverload()コンストラクタa = x; b = y。 a * bを返します。 ;}}; int main(){オーバーロードO1; 過負荷(20)。 //最初のoverload()コンストラクター呼び出しO1.overload(20, 40); // 2番目のoverload()コンストラクター呼び出し}
それでは、多態性の2番目の形式、つまりオーバーライドについて説明しましょう。 オーバーライドの概念は、継承の概念も実装しているクラスの機能に対してのみ実装できます。 C ++では、オーバーライドされる関数の前に基本クラスのキーワード "virtual"が置かれ、派生クラスの中でキーワード "virtual"を除いて同じプロトタイプで再定義されます。
class base {public:virtual void funct(){//基本クラスの仮想関数cout << "これは基本クラスのfunct()です"; ;}}; クラスderived1:publicベース{public:void funct(){// derived1クラスの仮想クラスで再定義されたクラスの仮想関数継承と多型の主な違い
- 継承は、既存のクラスからその機能を引き出すクラスを作成することです。 一方、多態性は複数の形式で定義できるインタフェースです。
- 継承はクラスに実装されていますが、ポリモーフィズムはメソッド/関数に実装されています。
- 継承によって派生クラスは基本クラスで定義された要素やメソッドを使用できるので、派生クラスはそれらの要素やメソッドを再度定義する必要がないため、コードの再利用性が高まり、コードの長さが短くなります。 。 一方、ポリモーフィズムにより、オブジェクトは、コンパイル時と実行時の両方でどの形式のメソッドを呼び出すかを決定できます。
- 継承は、単一継承、多重継承、多重レベル継承、階層継承、およびハイブリッド継承に分類できます。 一方、多相はオーバーロードとオーバーライドに分類されます。
結論:
動的多相は継承の概念も実装するクラスに適用されるため、継承と多相は相互に関連する概念です。