C++ での構造体の継承
構造体とクラスは似ていますが、違いは、オブジェクト指向プログラミングの他のクラスまたは関数へのアクセシビリティにあります。
構造体はデフォルトで public として指定されていますが、クラスは private です。 また、継承では、プライベートに指定されたクラスを継承できません。 クラス public を手動で宣言する必要がありますが、構造体はデフォルトで public であるため、簡単に継承できます。
C++ の継承とは
継承は、オブジェクト指向プログラミングの中心的な概念の 1つであり、その背後にある理由は、コードの再利用性と階層的な分類の作成を改善するためです。
継承の助けを借りて、いくつかの基本的な操作を実行するいくつかの関数を定義する一般的なクラスを定義し、それを他のクラスに拡張してそれらの関数を継承することができます。 図で理解してみましょう。
この例では、Dog
と Cat
があり、どちらも別の動物ですが、最終的には両方とも動物のペット カテゴリに属します。
これらはどちらも、基本クラスとも呼ばれる Pet
クラスに保存できる食事、睡眠、歩行などのいくつかの同じ機能を持ち、サウンドやサイズなどの固有の機能は Dog
と Cat
クラス、派生クラスとも呼ばれます。
このタイプの継承は、単一継承として知られています。 他にもさまざまなタイプがあり、以下で 1つずつ説明します。
コード例:
#include <iostream>
using namespace std;
// Base class
struct Pet {
void eat() { cout << "I can eat i am pet \n"; }
void sleep() { cout << "I can sleep i am pet \n"; }
void walk() { cout << "I can walk i am pet \n"; }
};
// Derived class
struct Cat : Pet {
void sound() { cout << "I am a cat Meow Meow! \n"; }
};
// Derived class
struct Dog : Pet {
void sound() { cout << "I am a dog Bark Bark! \n"; }
};
int main() {
cout << "This is Cat's characteristics" << endl;
Cat myCat;
myCat.eat();
myCat.sleep();
myCat.walk();
myCat.sound();
cout << "\nThis is Dog's characteristics" << endl;
Dog myDog;
myDog.eat();
myDog.sleep();
myDog.walk();
myDog.sound();
}
出力:
This is Cat's characteristics
I can eat i am pet
I can sleep i am pet
I can walk i am pet
I am a cat Meow Meow!
This is Dog's characteristics
I can eat i am pet
I can sleep i am pet
I can walk i am pet
I am a dog Bark Bark!
この例では、Pet
は基本クラスであり、Cat
と Dog
は派生クラスです。 Pet
は猫と犬の共通の振る舞いをいくつか定義しているので、コードの冗長性を避けるためにすべてのクラスでそれらを定義するわけではありません。
Dog
と Cat
は、これらの一般的な動作を拡張し、独自の派生クラスで特定の動作を定義します。
クラス Dog
と Cat
には、sound()
という 1つのビヘイビアーしかありませんが、もう 1つは基本クラスからのものです。 そして、これらの派生クラスのオブジェクトは、基本クラスの他の機能を使用しています。
C++ における継承の種類
C++ はさまざまな種類の継承をサポートしているため、シナリオに応じてそれぞれを使用する自由な選択肢があります。 一つ一つ見ていきましょう。
- 単一継承
- 多重継承
- マルチレベル継承
- 階層継承
- ハイブリッド継承
単一継承
単一継承では、1つの基本クラスと 1つの派生クラスがあります。 このタイプは、最初の例ですでに説明されています。
構文:
class derivedClass_name : access_mode base_class {
// body of the derived class
};
多重継承
多重継承では、複数の基本クラスの関数とプロパティを単一の派生クラスに継承できます。
構文:
class derivedClass_name : access_mode base_class1,
access_mode base_class2,
....{
// body of the derived class
};
マルチレベル継承
どのタイプの継承でも基本クラスから継承できますが、マルチレベル継承にはそれ以上のものがあります。 複数レベルの継承を可能にし、派生クラスから他のサブクラスへの継承を可能にします。
動物
とペット
は基本クラスであり、猫
は両方の基本クラスから関数とプロパティを継承する派生クラスです。
階層的継承
階層継承では、階層内の単一の基本クラスから複数のサブクラスが継承されます。 また、1つの基本クラスから複数の派生クラスが作成されます。
これは高度なタイプの継承です。
ハイブリッド継承
ハイブリッド継承という名前で知られているように、このタイプの継承は、階層継承や多重継承など、さまざまなタイプの継承で構成されています。 ハイブリッド継承では、任意の組み合わせを実行できます。
この例では、ハイブリッド継承として作成された、単一継承と階層継承の 2つの異なるタイプの継承があります。
C++ での構造体の継承
C++ では、struct
はクラスに似た構造を定義するために使用されるキーワードですが、わずかな違いがあります。 構造体とクラスの主な違いは、構造体のメンバーがデフォルトでパブリックであるのに対し、クラスにはプライベートがあるため、セキュリティ上の懸念が生じることです。
関数とプロパティがエンドユーザーから隠されているわけではないため、構造はあまり安全ではありません。 一方、クラスはプログラミングの実装をエンドユーザーから隠すことができるため、安全です。
構造体の一般的な構文:
struct structureName {
member1;
member2;
..memberN;
};
継承はオブジェクト指向プログラミングのコア機能であるため、構造体でもこの機能を使用できます。 構造体による継承には、クラスの代わりに struct
キーワードが必要です。
C++ での構造体の継承:
#include <iostream>
using namespace std;
// Base class
struct Pet {
void eat() { cout << "I can eat i am pet \n"; }
};
struct Dog : Pet {
void sound() { cout << "I am a dog Bark Bark! \n"; }
};
int main() {
cout << "\nThis is Dog's characteristics" << endl;
Dog myDog;
myDog.eat();
myDog.sound();
}
出力:
This is Dog's characteristics
I can eat i am pet
I am a dog Bark Bark!
構造体名の前に struct
という単語を使用しました。 struct はデフォルトで public であるため、構造体の本体に public
という単語を使用していないことに気付いた場合は、クラスに似ているように見えます。
Zeeshan is a detail oriented software engineer that helps companies and individuals make their lives and easier with software solutions.
LinkedIn