types inheritance c
例を使用して、C ++のすべてのタイプの継承を調べます。
前のチュートリアルでは、C ++での継承について学びました。クラスの派生方法またはクラスが継承する基本クラスの数に応じて、次のタイプの継承があります。
- 単一継承
- 多重継承
- マルチレベルの継承
- 階層継承
- ハイブリッド継承
=> 完全なC ++チュートリアルリストについては、こちらをご覧ください。
学習内容:
継承の種類
以下に示すのは、さまざまなタイプの継承の図解です。
以下のセクションでは、例を使用して各タイプの継承を確認します。
#1)単一継承
単一継承では、クラスは1つの基本クラスからのみ派生します。これは、1つのスーパークラスから派生したサブクラスが1つしかないことを意味します。
単一継承は通常、次のように宣言されます。
class subclassname : accessspecifier superclassname { //class specific code; };
以下に示すのは、単一継承の完全な例です。
#include #include using namespace std; class Animal { string name=''; public: int tail=1; int legs=4; }; class Dog : public Animal { public: void voiceAction() { cout<<'Barks!!!'; } }; int main() { Dog dog; cout<<'Dog has '< 出力:
犬は4本足です
犬のしっぽは1つ
犬の吠え声!!!
サブクラスの犬を派生させた基本クラスとして、クラスAnimalがあります。クラスdogは、Animalクラスのすべてのメンバーを継承し、出力からわかるように、独自のプロパティを含めるように拡張できます。
単一継承は、最も単純な形式の継承です。
#2)多重継承
多重継承は、以下に図で表されます。

多重継承は、クラスが複数のクラスから派生するタイプの継承です。上の図に示すように、クラスCは、クラスAとクラスBを親として持つサブクラスです。
実際のシナリオでは、子供は父親と母親から継承します。これは、多重継承の例と見なすことができます。
多重継承を示すために、以下のプログラムを紹介します。
#include using namespace std; //multiple inheritance example class student_marks { protected: int rollNo, marks1, marks2; public: void get() { cout <> rollNo; cout <> marks1 >> marks2; } }; class cocurricular_marks { protected: int comarks; public: void getsm() { cout <> comarks; } }; //Result is a combination of subject_marks and cocurricular activities marks class Result : public student_marks, public cocurricular_marks { int total_marks, avg_marks; public: void display() { total_marks = (marks1 + marks2 + comarks); avg_marks = total_marks / 3; cout << '
Roll No: ' << rollNo << '
Total marks: ' << total_marks; cout << '
Average marks: ' << avg_marks; } }; int main() { Result res; res.get(); //read subject marks res.getsm(); //read cocurricular activities marks res.display(); //display the total marks and average marks }
出力:
ロール番号を入力してください:25
最高点を2つ入力してください:40 50
CoCurricularアクティビティのマークを入力してください:30
ロール番号:25
合計点数:120
平均点数:40
上記の例では、student_marks、cocurricular_marks、Resultの3つのクラスがあります。クラスstudent_marksは、学生の件名マークを読み取ります。クラスcocurricular_marksは、課外活動における生徒のマークを読み取ります。
Resultクラスは、平均点とともに学生のtotal_marksを計算します。
このモデルでは、Subjectからの結果と課外活動のマークを計算するときに、Resultクラスはstudent_marksとcocurricular_marksから派生します。
これは多重継承を示します。
ダイヤモンド問題
ダイヤモンド問題は、以下に図で表されます。

ベータテスターは何をしますか
ここには、FatherとMotherの2つのクラスを継承する子クラスがあります。これらの2つのクラスは、Personクラスを継承します。
図に示すように、クラスChildは、クラスPersonの特性を2回継承します。つまり、1回目は父親から、2回目は母親から継承します。これにより、コンパイラがどちらに進むべきかを理解できないため、あいまいさが生じます。
このシナリオは、ひし形の継承がある場合に発生するため、この問題は有名に「 菱形継承問題 」。
C ++で実装されたDiamond問題は、コンパイル時にあいまいエラーを引き起こします。ルート基本クラスを仮想にすることで、この問題を解決できます。ポリモーフィズムに関する次のチュートリアルで、「仮想」キーワードについて詳しく学習します。
#3)マルチレベルの継承
マルチレベルの継承を以下に示します。

マルチレベル継承では、クラスは別の派生クラスから派生します。この継承は、実装がうまくいかない限り、多くのレベルを持つことができます。上の図では、クラスCはクラスBから派生しています。次に、クラスBはクラスAから派生しています。
マルチレベル継承の例を見てみましょう。
#include #include using namespace std; class Animal { string name=''; public: int tail=1; int legs=4; }; class Dog : public Animal { public: void voiceAction() { cout<<'Barks!!!'; } }; class Puppy:public Dog{ public: void weeping() { cout<<'Weeps!!'; } }; int main() { Puppy puppy; cout<<'Puppy has '< 出力:
子犬は4本足です
子犬のしっぽが1つ
子犬の吠え声!!!子犬は泣きます!
ここでは、単一継承の例を変更して、Dogクラスから継承する新しいクラスPuppyがあり、次にAnimalクラスから継承するようにしました。クラスPuppyは、その上の両方のクラスのプロパティとメソッドを取得して使用していることがわかります。
#4)ハイブリッド継承
ハイブリッド継承を以下に示します。

ハイブリッド継承は通常、複数のタイプの継承の組み合わせです。上記の表現では、ハイブリッド継承を取得するために、多重継承(B、C、およびD)とマルチレベル継承(A、B、およびD)があります。
ハイブリッド継承の例を見てみましょう。
#include #include using namespace std; //Hybrid inheritance = multilevel + multilpe class student{ //First base Class int id; string name; public: void getstudent(){ cout <> id >> name; } }; class marks: public student{ //derived from student protected: int marks_math,marks_phy,marks_chem; public: void getmarks(){ cout <>marks_math>>marks_phy>>marks_chem; } }; class sports{ protected: int spmarks; public: void getsports(){ cout <> spmarks; } }; class result : public marks, public sports{//Derived class by multiple inheritance// int total_marks; float avg_marks; public : void display(){ total_marks=marks_math+marks_phy+marks_chem; avg_marks=total_marks/3.0; cout << 'Total marks =' << total_marks << endl; cout << 'Average marks =' << avg_marks << endl; cout << 'Average + Sports marks =' << avg_marks+spmarks; } }; int main(){ result res;//object// res.getstudent(); res.getmarks(); res.getsports(); res.display(); return 0; }
出力:
学生IDと学生名25Vedを入力してください
3つの件名を入力してください:89 88 87
スポーツマークを入力してください:40
合計点数= 264
平均点= 88
平均+スポーツマーク= 128
ここには、Student、Marks、Sports、Resultの4つのクラスがあります。マークは学生クラスから取得されます。クラスResultは、サブジェクトマークとスポーツマークから結果を計算するときに、マークとスポーツから派生します。
出力は、3つのクラスすべてのプロパティを取得したResultクラスのオブジェクトを作成することによって生成されます。
ハイブリッド継承でも、実装によって「ダイヤモンドの問題」が発生する可能性があることに注意してください。これは、前述のように「仮想」キーワードを使用して解決できます。
#5)階層的継承

階層継承では、上記の表現に示すように、複数のクラスが単一の基本クラスから継承します。これにより、階層構造が得られます。
以下に示すのは、階層継承を示す例です。
#include using namespace std; //hierarchical inheritance example class Shape // shape class -> base class { public: int x,y; void get_data(int n,int m) { x= n; y = m; } }; class Rectangle : public Shape // inherit Shape class { public: int area_rect() { int area = x*y; return area; } }; class Triangle : public Shape // inherit Shape class { public: int triangle_area() { float area = 0.5*x*y; return area; } }; class Square : public Shape // inherit Shape class { public: int square_area() { float area = 4*x; return area; } }; int main() { Rectangle r; Triangle t; Square s; int length,breadth,base,height,side; //area of a Rectangle std::cout <>length>>breadth; r.get_data(length,breadth); int rect_area = r.area_rect(); std::cout << 'Area of the rectangle = ' <base>>height; t.get_data(base,height); float tri_area = t.triangle_area(); std::cout <<'Area of the triangle = ' << tri_area<side; s.get_data(side,side); int sq_area = s.square_area(); std::cout <<'Area of the square = ' << sq_area< 出力:
長方形の長さと幅を入力します:10 5
長方形の面積= 50
三角形の底辺と高さを入力します:4 8
三角形の面積= 16
正方形の一辺の長さを入力してください:5
正方形の面積= 20
上記の例は、Shapeクラスの典型的な例です。基本クラスShapeがあり、長方形、三角形、正方形の3つのクラスが派生しています。
Shapeクラスのデータを読み取るメソッドがありますが、派生クラスごとに面積を計算する独自のメソッドがあります。 main関数では、各オブジェクトのデータを読み取り、面積を計算します。
結論
他のプログラミング言語と比較すると、C ++言語はすべてのタイプの継承をサポートしています。実際、C ++は継承を非常によくサポートしていると言えます。 C ++を使用すると、リアルタイムの問題をより効果的にモデル化できます。
このチュートリアルでは、C ++でサポートされているすべての種類の継承について説明しました。
また読む= >> Javaでの継承の種類
今後のチュートリアルでは、OOPのポリモーフィズム機能について詳しく学習します。
=> ここで完全なC ++無料トレーニングシリーズを確認してください。
推奨読書