ポリモーフィズムと継承:ポリモーフィズムと継承の違い[2022]
公開: 2021-01-05ポリモーフィズムと継承はどちらも、オブジェクト指向プログラミングの非常に基本的な概念です。 現代のプログラミング言語にオブジェクトを追加することで、言語の使用方法とオブジェクトを使用して実行できる処理に大きな違いが生じました。 一言で言えば、オブジェクト指向プログラミングは、プログラマーがクラスを使用できるようにする一連のメソッドであり、したがって、これらのクラスに基づいてオブジェクトを派生させることができます。
これは、実際のエンティティに似ており、プログラマーがコードを記述しているパラダイムを含むコードを簡単に作成できるようにすることを目的としています。オブジェクト指向プログラミングの概念には、継承、抽象化、ポリモーフィズム、カプセル化の4つがあります。 さて、前述のように、それぞれのアイデアは、現代の言語が立つ柱と考えることができます。
ポリモーフィズムと継承、そしてコウモリの権利というトピックに戻ると、2つの概念の間に明白な違いがあります。 継承は、コードを同じプログラムまたは異なるプログラムで再利用できるようにする概念です。 好きなものを保持し、実行しようとしているタスクに役立たないものを破棄することで、コードの動作を変更することもできます。 継承により、今日のデジタルディスプレイに表示されるほとんどすべてのものを開発する時間を大幅に節約できます。
一方、ポリモーフィズムは、すでに作成されたコードを指示し、特定のパラメーターに基づいてリアルタイムで実行する必要のあるコードの種類を決定する役割を果たします。 ポリモーフィズムと継承の違いの議論に移る前に、最初にこれらの概念のそれぞれを最初に詳細に検討することは誰にとっても有益です。 継承とポリモーフィズムが正確に何を意味するのかがわかれば、違いはより顕著になります。
世界のトップ大学からソフトウェアエンジニアリングの学位を取得します。 エグゼクティブPGプログラム、高度な証明書プログラム、または修士プログラムを取得して、キャリアを早急に進めましょう。
目次
継承
継承を非常に重要なOOPの概念と見なさないことは、プログラミングパラダイムの犯罪になります。 継承の目的は「再利用性」であるため、継承の重要性を軽視してはなりません。 継承は、その名前が示すように、あるクラスで記述されたコードを別のクラスに拡張できるようにすることを意味します。 したがって、継承には基本クラスが存在します。 コードが記述されているクラスは再利用されます。

基本クラスに関連付けられているすべての関数と変数を使用するには、作成する次のクラスをこの基本クラスから継承する必要があります。 クラスが別のクラスのプロパティを取得する(または別のクラスから継承する)ときはいつでも、基本クラスに存在するすべてのメンバーがこの新しい派生クラスのメンバーになります。
以下に示すサンプルコードは、継承の一般的な形式がどのように見えるかを示しています。 ここで注意すべき重要な点の1つは、コードの継承を有効にするために記述しなければならない正確な構文は、選択したプログラミング言語にのみ依存するということです。
- クラス派生クラス名:アクセス指定子ベースクラス名{
- //派生クラスの本体
- }
上記の例では、特定の事柄について少し説明する必要があります。 「アクセス指定子」という言葉は、派生クラスが基本クラスのプロパティとメソッドにアクセスする方法を意味します。 一般に3つのアクセス指定子があり、それぞれに独自の意味(つまり、プライベート、パブリック、および保護)とプロパティがあります。
繰り返しになりますが、選択した言語に応じて、これらのアクセス指定子を使用する必要がある場合と使用しない場合があります。 したがって、C ++の世界では、デフォルトで何も指定せずに継承すると、プライベートになります。 ただし、構造体から継承する場合(キーワードstructを使用)、デフォルトのアクセス指定子はprivateではなくpublicになります。
読む: Rプログラミング言語でのキャリアの機会
C ++には、継承を行うときに選択できる多くのオプションもあります。 それらのいくつかを以下に示します。
a。 階層的継承:このタイプの継承は、スーパークラスは1つだけであり、そのスーパークラスからは、派生したサブクラスが多数存在する必要があるという規則に従います。 以下にその例を示します。
- //基本クラス
- クラスA
- {{
- public void funA()
- {{
- //
- }
- }
- //派生クラス
- クラスB:A
- {{
- public void funB()
- {{
- //
- }
- }
- //派生クラス
- クラスC:A
- {{
- public void funC()
- {{
- //
- }
- }
- //派生クラス
- クラスD:C
- {{
- public void funD()
- {{
- //
- }
- }
- //派生クラス
- クラスE:C
- {{
- public void funE()
- {{
- //
- }
- }
- //派生クラス
- クラスF:B
- {{
- public void funF()
- {{
- //
- }
- }
- //派生クラス
- クラスG:B
- {{
- public void funG()
- {{
- //
- }
- }
b。 多重継承:多重継承を行っている場合、それは、複数のスーパークラスから継承している派生サブクラスが1つしかないことを意味します。 多重継承の簡単な例を以下に示します。
- //基本クラス
- クラスA
- {{
- public void funA()
- {{
- //
- }
- }
- //基本クラス
- クラスB
- {{
- public void funB()
- {{
- //
- }
- }
- //派生クラス
- クラスC:A、B
- {{
- public void funC()
- {{
- //
- }
- }
c。 単一継承:これはおそらく最も単純な形式の継承です。 基本クラスと派生クラスは1つだけです。 以下に例を示します。
- //基本クラス
- クラスA
- {{
- public void funA()
- {{
- //やること:
- }
- }
- //派生クラス
- クラスB:A
- {{
- public void funB()
- {{
- //やること:
- }
- }
ポリモーフィズム
ポリモーフィズムという言葉の基本的な定義は、多くの形を持つことを意味します。 この定義は、プログラミングのコンテキストでポリモーフィズムを説明する際に非常に正確に当てはまります。 このパラダイムでは、ポリモーフィズムは1つの関数の意味を取りますが、多くの形式を取ります。 ポリモーフィズムは実際にはコンパイル時に発生します。 コンパイル時のポリモーフィズムは、オーバーロードの概念のためにのみ可能であり、実行時には、オーバーライドの機能によってポリモーフィズムが実現されます。 一つ一つ、オーバーロードとオーバーライドの両方の定義に取り組みましょう。

オーバーロードでは、作成するコードまたはクラスの関数を、異なるパラメーターを使用して同じリターン型で複数回作成する必要があります。 これは、関数に渡す引数が異なる可能性があることを意味し、実行時に関数に渡される最終値を確認するだけで、どの形式の関数が呼び出されるかが決定されます。 一般に、クラスコンストラクターが最もオーバーロードされた関数であることがわかります。 このすべての理論は非常に明確になり、例の助けを借りてあなたがそれをあなたの心に染み込ませるのがより簡単になるでしょう。
- クラスの過負荷{
- int a、b;
- 公衆:
- intoverload( int x){//最初のoverload ()コンストラクター
- a = x;
- 返す;
- }
- intoverload ( int x、int y){// 2番目のoverload()コンストラクター
- a = x;
- b = y;
- a*bを返します。
- }
- };
- int main (){
- 過負荷O1;
- O1。 過負荷(20); //最初のoverload()コンストラクター呼び出し
- O1。 過負荷(20,40); // 2番目のoverload()コンストラクター呼び出し
この例では、オーバーロードが実際に行われているのがわかります。 オブジェクトの括弧の最終値が1つの整数であるか2つであるかに応じて、さまざまなコンストラクターがどのように呼び出されるかを確認してください。
次に、オーバーライドの定義に取り組みましょう。 継承された特定の関数に対してのみオーバーライドを実行できます。 はい、継承は関数のオーバーライドを可能にするための重要なポイントです。 関数を記述してオーバーライドする場合は、C ++では関数定義の前にキーワードvirtualを使用する必要があり、関数に同じ名前を使用する派生クラスでは、virtualキーワードを削除するだけです。 あなたの理解を固めるために、ここに例があります:
- クラスベース{
- 公衆:
- virtual void funct (){//基本クラスの仮想関数
- cout <<“これは基本クラスのfunct()です”;
- }
- };
- クラス派生1:パブリックベース{
- 公衆:
- void funct (){//派生1クラスで再定義された基本クラスの仮想関数
- cout <<“これはderived1クラスのfunct()です”;
- }
- };
- int main ()
- {{
- ベース*p、b;
- 派生1d1;
- * p =&b;
- p->関数(); //基本クラスfunct()を呼び出します。
- * p =&d1;
- 0を返します。
- }
基本クラスでキーワードvirtualがどのように使用されているかを見てください。派生クラスでは、キーワードvirtualがないだけで同じ関数定義があります。
ポリモーフィズムと継承の間のいくつかのこだわりの違い:
- 継承とは、基本的にクラスを作成し、プログラム内の他のクラスに、既存の基本クラスからそれらの機能を取得させることです。 ただし、ポリモーフィズムはインターフェースであり、インターフェースであるため、さまざまな形や形をとることができます。
- 継承はクラスだけに関係するプロパティですが、ポリモーフィズムはそれ自体を任意のメソッドや関数に拡張します。
- 継承により、派生クラスは、それらを再度明示的に定義することなく、基本クラスで宣言されたすべての関数と変数を使用できます。 そのため、継承によってコードの再利用性が向上し、コードの長さが短くなります。継承がない場合は、コードを作成する必要があります。 一方、ポリモーフィズムでは、同じ関数名に2つの非常に異なるコードを含めることができます。 したがって、ある意味で、記述しなければならないコードの長さを短縮する代わりに、ポリモーフィズムはそれをさらに拡張しています。
- 継承には多くの形式があります。 あなたは相続で本当に創造的になることができます。 ただし、ポリモーフィズムは、オーバーロードとオーバーライドの2つの手段でのみ実現できます。 ポリモーフィズムを使用している間も非常に夢中になる可能性がありますが、それを記述コードに実装する方法は2つに制限されています。
必読:新入生と経験者のための47のOOPSインタビューの質問と回答を読む必要があります
ポリモーフィズムと継承:表形式の差別化
次の表で、ポリモーフィズムと継承の明確な違いを確認できます。

比較措置 | 継承 | ポリモーフィズム |
2つの基本的な違い | 継承の意味は、プロパティ(既存のクラスの関数と変数)を持つ新しいクラスを作成することです。 | これは本質的に、コードをさまざまな形式で記述できるようにするプラットフォームです。 |
両方をコードに統合する方法の違い | クラスだけがコードで実際の継承を楽しむことができます。 | これは、コード全体で任意の関数やメソッドによって実装および使用できます。 |
両方の使用方法の違い。 | これにより、記述されたコードを同じプログラムまたは異なるプログラム内で再利用できます。 それがなければ、オブジェクト指向プログラミングには重要な機能が欠けていたでしょう。 | これにより、宣言されたオブジェクトは、呼び出される関数の形式を決定できます。 これを決定できるのは2回あります。 実行時には、オーバーライドと呼ばれます。 コンパイル時に、オーバーロードと呼ばれます。 |
それらの両方が取ることができる異なる形 | 継承がとることができる形はたくさんあります。 | 多型には2つの形式しかありません。 プログラムの時間に応じて、オーバーロードからオーバーライドに変わります。 |
それぞれがどのように実装されるかを示す基本的な例。 | クラスバイクは、二輪車のクラスから継承できます。二輪車は、車両のサブクラスになる可能性があります。 | クラスbikeには、set_color()という名前のメソッドを含めることができます。このメソッドは、入力した色の名前に基づいて自転車の色を変更します。 |
チェックアウト: Javaでの型キャストとは| 初心者として型キャストを理解する
結論
ポリモーフィズムと継承の両方が、プログラムを実現する上で重要な概念であると言っても過言ではありません。 これらは両方とも、オブジェクト指向プログラミングのアイデアが築かれた基礎です。 ポリモーフィズムと継承には、2つの非常に異なる目的があるため、多くの違いがあります。
ポリモーフィズムにより、プログラマーは関数の複数の定義を書くことができます。 同時に、継承により、ユーザーはすでに記述されたコードを再利用できます。 2つの概念を完全に理解して理解するには、両方のトピックについてさらに読むことをお勧めします。
コードを書くときは常に心に留めておくべきことの1つは、すでに書いたコードをリファクタリングしようとしている場合です(基本的に、1つのクラスの定義をコードで再度使用して、類似または異なるサービスを提供します)。目的)、継承を利用する必要があります。 コードの全体的な混乱を減らし、同じ名前の関数を使用して同様のタスクを実行する場合は、ポリモーフィズムを使用する必要があります。
フルスタックソフトウェア開発の詳細に興味がある場合は、upGrad&IIIT-Bのフルスタックソフトウェア開発のPGディプロマをチェックしてください。これは、働く専門家向けに設計されており、500時間以上の厳格なトレーニング、9以上のプロジェクト、および割り当て、IIIT-B卒業生のステータス、実践的な実践的なキャップストーンプロジェクト、トップ企業との仕事の支援。
