GeeksforGeeks (日本語)

別のクラスからプロパティと特性を派生させるクラスの機能は、継承と呼ばれます。 継承はオブジェクト指向プログラミングの最も重要な特徴の一つである。
サブクラス:別のクラスからプロパティを継承するクラスをサブクラスまたは派生クラスと呼びます。
スーパークラス:プロパティがサブクラスによって継承されるクラスは、基本クラスまたはスーパークラス

この記事は次のサブトピックに分かれています。

  1. 継承を使用する理由とタイミングは何ですか?,
  2. 継承のモード
  3. 継承のタイプ

なぜ、いつ継承を使用するのですか?

車両のグループを考えてみましょう。 バス、車、トラック用のクラスを作成する必要があります。 メソッドfuelAmount()、capacity()、applyBrakes()は、すべてのクラスで同じになります。,

上記のプロセスでは、同じコードが3回重複することがはっきりとわかります。 これにより、エラーやデータ冗長性の可能性が高まります。 このタイプの状況を避けるために、継承が使用されます。, クラスVehicleを作成し、これら三つの関数をその中に記述し、残りのクラスをvehicleクラスから継承すると、データの重複を避け、再利用性を高めることができま

継承を使用して、基本クラス(Vehicle)から三つのクラスの残りの部分を継承しているので、関数を一度だけ書く必要があります。,

c++での継承の実装:基本クラスから継承されたサブクラスを作成するには、以下の構文に従わなければなりません。
構文:

class subclass_name : access_mode base_class_name{ //body of subclass};

ここで、subclass_nameはサブクラスの名前であり、access_modeはこのサブクラスを継承するモードです例:パブリック、プライベートなど。 また、base_class_nameは、サブクラスを継承する基本クラスの名前です。
注:派生クラスは、プライベートデータメンバーへのアクセスを継承しません。, ただし、そのクラスが宣言するプライベートメンバーを含む完全な親オブジェクトを継承します。



出力:

Child id is 7Parent id is 91

上記のプログラムでは、’Child’クラスは’Parent’クラスからパブリックに継承されるため、クラス’Parent’のパブリックデータメンバーもクラス”子ども”。

継承のモード

  1. パブリックモード:パブリック基本クラスからサブクラスを派生させた場合。, その後、基本クラスのpublicメンバーは派生クラスでpublicになり、基本クラスのprotectedメンバーは派生クラスでprotectedになります。
  2. 保護モード:保護された基本クラスからサブクラスを派生させた場合。 その後、基本クラスのpublicメンバーとprotectedメンバーの両方が派生クラスでprotectedになります。
  3. プライベートモード:プライベート基本クラスからサブクラスを派生させた場合。 その後、基本クラスのpublicメンバーとprotectedメンバーの両方が派生クラスでPrivateになります。,

メモ:基本クラスのプライベートメンバーは派生クラスで直接アクセスできませんが、保護メンバーは直接アクセスできます。 たとえば、クラスB、C、およびDはすべて、以下の例の変数x、y、およびzを含みます。 それは単なるアクセスの問題です。,

以下の表は上記の三つのモードのアクセス指定子のメンバーの基底クラスのサブクラスが得られたpublic、protected、または民間のモード

種類の遺産をC++

特別な場合のハイブリッドの継承:マルチパスの継承:
導出クラスと基底クラスでは、この二つの基底クラスにおいて共通の基底クラスではマルチパスと呼ばれます。 このタイプの継承ではあいまいさが生じる可能性があります。,

次のプログラムを考えてみましょう。



出力:

A from ClassB : 10A from ClassC : 100B : 20C : 30D : 40

上記の例では、両方のclassb&classcはclassaを継承し、両方ともclassaの単一のコピーを持っています。 しかし、ClassDは両方を継承しますClassB&ClassC、したがって、ClassDはClassAの二つのコピーを持ち、ClassBからのものとClassCからのものがあります。,
私たちは、データメンバーにアクセスする必要がある場合Classaのオブジェクトを介してClassD、我々はそれがClassBまたはClassCからであるかどうか、aがアクセスされるパスを指定する必要があります、bco’zコンパイラは、ClassDのClassAの二つのコピーを区別することはできません。
このあいまいさを回避するには2つの方法があります。

  1. スコープ解決演算子を使用する
  2. 仮想基本クラスを使用する

スコープ解決演算子を使用するあいまいさを回避する:
スコープ解決演算子を使用する上記の例のステートメンバーaにアクセスするパスを手動で指定することができます(スコープ解決演算子を使用する3と4に示すように)。,

obj.ClassB::a = 10;
obj.ClassC::a = 100;



注:まだ、classdにclassaの二つのコピーがあります。,
仮想基底クラスを使用してあいまいさを避ける:



出力:

A : 100B : 20C : 30D : 40

上記の例によれば、ClassDはClassAのコピーしか持たないため、ステートメント4はClassAの値を上書きします。a、文3で与えられます。

この記事はHarsh Agarwalによって寄稿されています。 GeeksforGeeksが好きで、貢献したい場合は、以下を使用して記事を書くこともできますcontribute.geeksforgeeks.org またはあなたの記事を郵送する[email protected]—–, GeeksforGeeksのメインページに表示されるあなたの記事を参照してくださいし、他のオタクを助けます。

注目の読者! 今学習を停止しないでください。 学生に優しい価格でC++FoundationおよびSTLコースですべての重要なC++FoundationおよびSTLの概念を手に入れ、業界の準備ができています。

記事タグ:

C++
練習タグ:

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です