C++ の複数、マルチレベル、および階層的な継承
C++ の多重、マルチレベル、階層継承
このチュートリアルでは、C++ プログラミングにおける継承のさまざまなモデルについて学習します:例を使用して、多重継承、マルチレベル継承、および階層継承です。
継承は、オブジェクト指向プログラミング言語のコア機能の 1 つです。これにより、ソフトウェア開発者は既存のクラスから新しいクラスを派生させることができます。派生クラスは、基本クラス (既存のクラス) の機能を継承します。
C++ プログラミングにはさまざまな継承モデルがあります。
C++ マルチレベル継承
C++ プログラミングでは、基底クラスからクラスを派生できるだけでなく、派生クラスからクラスを派生させることもできます。この形式の継承は、マルチレベル継承として知られています。
class A { ... .. ... }; class B: public A { ... .. ... }; class C: public B { ... ... ... };
ここでは、クラス B 基本クラス A から派生しています そしてクラス C 派生クラス B から派生しています .
例 1:C++ マルチレベル継承
#include <iostream>
using namespace std;
class A {
public:
void display() {
cout<<"Base class content.";
}
};
class B : public A {};
class C : public B {};
int main() {
C obj;
obj.display();
return 0;
}
出力
Base class content.
このプログラムでは、クラス C クラス B から派生しています (これは基本クラス A から派生したものです ).
オブジェクト クラス C のオブジェクト main()
で定義されています 関数。
display()
のとき 関数が呼び出されます、display()
クラス A で 実行されます。 display()
がないからです クラス C の関数 およびクラス B .
コンパイラは最初に display()
を探します クラス C の関数 .そこには関数が存在しないため、クラス B で関数を探します (Cとして B から派生しています ).
この関数はクラス B にも存在しません 、したがって、コンパイラはクラス A でそれを探します (Bとして A から派生しています ).
display()
の場合 関数は C に存在します 、コンパイラは display()
をオーバーライドします クラスAの (メンバー関数のオーバーライドのため)。
C++ 多重継承
C++ プログラミングでは、クラスは複数の親から派生できます。たとえば、クラス Bat 基本クラス Mammal から派生しています と WingedAnimal .コウモリは翼のある動物であると同時に哺乳類でもあるため、これは理にかなっています。
<図>例 2:C++ プログラミングにおける多重継承
#include <iostream>
using namespace std;
class Mammal {
public:
Mammal() {
cout << "Mammals can give direct birth." << endl;
}
};
class WingedAnimal {
public:
WingedAnimal() {
cout << "Winged animal can flap." << endl;
}
};
class Bat: public Mammal, public WingedAnimal {};
int main() {
Bat b1;
return 0;
}
出力
Mammals can give direct birth. Winged animal can flap.
多重継承のあいまいさ
多重継承の最も明白な問題は、関数のオーバーライド中に発生します。
2 つの基本クラスが、派生クラスでオーバーライドされない同じ関数を持っているとします。
派生クラスのオブジェクトを使用して関数を呼び出そうとすると、コンパイラはエラーを表示します。これは、コンパイラが呼び出す関数を認識していないためです。たとえば、
class base1 {
public:
void someFunction( ) {....}
};
class base2 {
void someFunction( ) {....}
};
class derived : public base1, public base2 {};
int main() {
derived obj;
obj.someFunction() // Error!
}
この問題は、スコープ解決関数を使用して、どの関数を base1 または base2 のいずれかに分類するかを指定することで解決できます。
int main() { obj.base1::someFunction( ); // Function of base1 class is called obj.base2::someFunction(); // Function of base2 class is called. }
C++ 階層継承
基本クラスから複数のクラスが継承される場合、それは階層継承と呼ばれます。階層継承では、子クラスに共通するすべての機能が基本クラスに含まれます。
たとえば、Physics、Chemistry、Biology は Science クラスから派生しています。同様に、Dog、Cat、Horse は Animal クラスから派生しています。
階層継承の構文
class base_class { ... .. ... } class first_derived_class: public base_class { ... .. ... } class second_derived_class: public base_class { ... .. ... } class third_derived_class: public base_class { ... .. ... }
例 3:C++ プログラミングにおける階層的継承
// C++ program to demonstrate hierarchical inheritance
#include <iostream>
using namespace std;
// base class
class Animal {
public:
void info() {
cout << "I am an animal." << endl;
}
};
// derived class 1
class Dog : public Animal {
public:
void bark() {
cout << "I am a Dog. Woof woof." << endl;
}
};
// derived class 2
class Cat : public Animal {
public:
void meow() {
cout << "I am a Cat. Meow." << endl;
}
};
int main() {
// Create object of Dog class
Dog dog1;
cout << "Dog Class:" << endl;
dog1.info(); // Parent Class function
dog1.bark();
// Create object of Cat class
Cat cat1;
cout << "\nCat Class:" << endl;
cat1.info(); // Parent Class function
cat1.meow();
return 0;
}
出力
Dog Class: I am an animal. I am a Dog. Woof woof. Cat Class: I am an animal. I am a Cat. Meow.
ここでは、両方の Dog
と Cat
クラスは Animal
から派生します クラス。そのため、両方の派生クラスが info()
にアクセスできます Animal
に属する関数 クラス。
C言語