C++ の継承の種類 知っておくべきことは?
公開: 2023-04-05いくつかの一般的なソフトウェア システムがどのように構築されているのか疑問に思ったことはありませんか? これはすべて、オブジェクト指向プログラミング (OOP) の継承と呼ばれる強力なメカニズムのおかげです。 継承により、プログラマーは既存のクラスに基づいて構築された新しいクラスを作成できるため、コードの再利用と効率的なソフトウェア開発が可能になります。 それぞれがいくつかの共通の属性と動作を共有するいくつかのクラスを必要とするシステムを構築していると想像してください。
同じコードを繰り返し記述する代わりに、継承を使用して基本クラスを作成し、そこから新しいクラスを派生させることができるため、時間と労力を節約できます。
継承は効率的であるだけでなく、汎用性もあります。 C++ にはいくつかの種類の継承があり、それぞれに固有の利点とユース ケースがあります。
この記事では、 C++ のさまざまなタイプの継承を完全に見ていき、関連するコード、説明、実際の例を記事全体で提供します。
目次
C++ におけるさまざまな種類の継承
C++ プログラミング言語は、そのプログラマーに 5 種類の継承オプションを提供します。 コンテキストと要件に応じて、開発者とプログラマーはこれらのタイプの継承のいずれかを使用できます。
単一継承
単一継承は、C++ で最も一般的なタイプの継承です。 単一継承では、派生クラスは単一の基本クラスから継承します。 これは、クラスが、独自のデータ メンバーとメンバー関数を追加する機能を持ちながら、基本クラスのすべてのパブリック データ メンバーと保護されたデータ メンバーとメンバー関数を継承することを意味します。
以下のコード スニペットをチェックして、単一継承の構文と理解を深めてください。
// 基本クラス
クラス 動物 {
公共:
ボイドイート() {
std::cout << 「動物が食べています」 << std::endl;
}
};
// 派生クラス
クラス Dog : public Animal {
公共:
ボイド樹皮() {
std::cout << 「犬が吠えています」 << std::endl;
}
};
この例では、 1 つのメンバー関数eat()を持つAnimalという基本クラスがあります。次に、Animalからパブリックに継承する派生クラスDogを定義します。Dog には独自のメンバー関数 bark() もあります。 単一継承を使用することで、Dog はAnimal クラスのeat() 関数にアクセスし、bark() 関数で独自の動作を追加できます。
C++ で単一継承を使用する場合
プログラマは、単一継承を使用して、基本クラスに機能を追加する派生クラスを作成できます。
たとえば、戦士、魔法使い、射手など、さまざまなキャラクターが関与するゲームを作成するときに、単一継承を使用できます。 これらのキャラクターはすべて、ヘルス ポイント、攻撃力、移動速度など、いくつかの共通の属性と動作を共有しています。 単一継承を使用すると、共通の属性と動作を含む Character という基本クラスを作成し、そこから各文字クラスを派生させて独自の機能を追加できます。
多重継承では、1 つの派生クラスが複数の基本クラスから継承できます。 これは、クラスが複数の直接の親クラスを持つことができることを意味します。 その結果、派生クラスは、各基本クラスのすべてのパブリックおよび保護されたデータ メンバーとメンバー関数を継承します。
多重継承の例を次に示します。
// 基本クラス 1
クラス形状{
公共:
仮想ダブルエリア() = 0;
};
// 基本クラス 2
クラスの色 {
公共:
仮想 std::string getColor() = 0;
};
// 派生クラス
class Rectangle : public Shape, public Color {
公共:
double area() オーバーライド {
戻り幅 * 高さ;
}
std::string getColor() オーバーライド {
色を返す;
}
プライベート:
ダブル幅 = 5.0;
倍の高さ = 3.0;
std::string color = “青”;
};
この例では、2 つの基本クラスShape と Color があり、それぞれに仮想関数があります。次に、Shape と Color の両方を継承する派生クラスRectangleを定義します。Rectangle は、両方の基本クラスの仮想関数をオーバーライドして、独自の実装を提供します。多重継承を使用することで、Rectangle はShapeとColorの両方の基本クラスのプロパティを継承して、特定の色と領域を持つ四角形を作成できます。
C++ で多重継承を使用する場合
複数の基本クラスの機能を組み合わせる場合は、多重継承を使用します。 たとえば、ボタン、チェックボックス、テキストボックスなど、さまざまな種類のコントロールを必要とする GUI アプリケーションを考えてみましょう。 各コントロール タイプには独自の機能と動作がありますが、ユーザー イベントの処理やテキストの表示など、いくつかの共通機能も共有しています。
多重継承を使用することで、共通の機能を含むControlという基本クラスを作成し、そこから各コントロール タイプを派生させ、特定の機能を含む他の基本クラスを派生させることができます。
階層継承では、1 つの基底クラスが複数の派生クラスに継承されます。 多重継承と同様に、階層継承の派生クラスは、基本クラスのすべてのパブリックおよび保護されたデータ メンバーとメンバー関数を取得します。
C++ での階層継承の実装を理解するのに役立つコード スニペットを次に示します。
// 基本クラス
クラス 動物 {
公共:
virtual void makeSound() = 0;
};
// 派生クラス 1
class Cat : public Animal {
公共:
void makeSound() オーバーライド {
std::cout << 「ニャー」 << std::endl;
}
};
// 派生クラス 2
クラス Dog : public Animal {
公共:
void makeSound() オーバーライド {
std::cout << 「横糸」 << std::endl;
}
};
この例では、仮想関数 makeSound() を持つAnimalという基本クラスがあります。次に、2 つの派生クラスCatとDogを定義します。これらは両方ともAnimalから継承されます。 各派生クラスは、makeSound()関数をオーバーライドして独自の実装を提供します。階層的な継承を使用して、音を出すなどの共通の動作を共有するさまざまな種類の動物を作成できます。
C++ で階層的継承を使用する場合
共通の機能を共有する複数の派生クラスを作成する場合は、階層継承を使用します。 たとえば、普通預金口座、当座預金口座、クレジット カード口座など、さまざまな種類の口座を必要とする銀行アプリケーションを考えてみましょう。 これらの口座タイプはすべて、口座番号、残高、金利など、いくつかの共通の属性と動作を共有しています。
階層継承を使用することで、共通の属性と動作を含む Account という基本クラスを作成し、そこから各アカウント タイプを派生させて独自の機能を追加できます。
マルチレベル継承
C++ のマルチレベル継承は、派生クラスが別の派生クラスによって継承されるタイプの継承です。 このシナリオでは、派生クラスは、その直接の親クラスのすべてのパブリック データ メンバーと保護されたデータ メンバーおよびメンバー関数を継承し、さらにその親クラスから継承します。
C++ でマルチレベル継承をプログラムで実装する方法を次に示します。
// 基本クラス
クラスビークル{
公共:
ボイドスタート() {
std::cout << 「車両が始動しています」 << std::endl;
}
};
// 中間クラス
クラス Car : public Vehicle {
公共:
ボイドドライブ() {
std::cout << 「車が運転中です」 << std::endl;
}
};
// 派生クラス
クラス SportsCar : public Car {
公共:
ボイド加速() {
std::cout << 「スポーツカーが加速中」 << std::endl;
}
};
C++ でマルチレベル継承を使用する場合
別の派生クラスから継承し、その機能を追加する派生クラスを作成する場合は、マルチレベル継承を使用します。 たとえば、車、トラック、オートバイなど、さまざまな種類の車両を必要とするソフトウェア システムを考えてみましょう。 これらの車両タイプは、速度、加速、ブレーキなど、いくつかの共通の属性と動作を共有しています。
複数レベルの継承を使用することで、共通の属性と動作を含むVehicleという基本クラスを作成し、そこからCarやTruckなどの中間クラスを派生させて、特定の機能を追加できます。次に、Car クラスからSportsCar クラスを派生させて、独自の機能を追加できます。
ハイブリッド継承は、2 種類以上の継承の組み合わせです。 仮想継承とも呼ばれ、ハイブリッド継承の派生クラスは複数の基本クラスから継承し、その一部は複数のパスを介して継承されます。 これにより、複雑な継承階層が作成される可能性があり、理解と維持が困難になる可能性があります。
upGrad のソフトウェア開発コースをチェックして、自分自身のスキルアップを図ってください。
C++ でのハイブリッド継承の例を次に示します。
// 基本クラス 1
クラス 動物 {
公共:
virtual void makeSound() = 0;
};
// 基本クラス 2
クラスキャンフライ{
公共:
virtual void fly() = 0;
};
// 基本クラス 3
クラスCanSwim {
公共:
virtual void swim() = 0;
};
// 派生クラス
class Bat : public Animal, public CanFly {
公共:
void makeSound() オーバーライド {
std::cout << 「金切り声!」<< std::endl;
}
void fly() オーバーライド {
std::cout << 「コウモリが飛んでいます」 << std::endl;
}
};
// 派生クラス
class Penguin : public Animal, public CanSwim {
公共:
void makeSound() オーバーライド {
std::cout << 「フーンク!」<< std::endl;
}
void swim() オーバーライド {
std::cout << 「ペンギンが泳いでいます」 << std::endl;
}
};
人気のソフトウェア エンジニアリング コースを探す
LJMU & IIITB のコンピューター サイエンスの理学修士号 | カリフォルニア工科大学 CTME サイバーセキュリティ証明書プログラム |
フルスタック開発ブートキャンプ | ブロックチェーンのPGプログラム |
フルスタック開発のエグゼクティブ PG プログラム | |
以下のすべてのコースを表示 | |
ソフトウェア工学コース |
C++ でハイブリッド継承を使用する場合
前述の 4 種類の継承に加えて、ハイブリッド継承は、複数の種類の継承が必要な特定のシナリオで役立ちます。 ハイブリッド継承を使用して、複数の継承タイプの利点を組み合わせます。
たとえば、さまざまな種類の動物を必要とするソフトウェア システムを考えてみましょう。動物の中には、飛ぶことができる動物もいれば、泳ぐことができる動物もいます。 ハイブリッド継承を使用して、 Animalという基本クラスを作成し、そこから2 つの中間クラスCanFlyとCanSwimを派生させることができます。最後に、ハイブリッド継承を使用して、BatクラスとPenguinクラスを両方の中間クラスから派生させることができます。BatクラスはAnimalとCanFlyを継承し、PenguinクラスはAnimalとCanSwimを継承します。このようにして、ユニークな能力の組み合わせを持つさまざまな種類の動物を作成できます。
C++ のハイブリッド継承は、複数の種類の継承が必要な複雑なソフトウェア システムで役立ちます。 ただし、理解と維持が困難な複雑な継承階層が作成されることもあります。 他のタイプの継承と同様に、特定のソフトウェア開発プロジェクトの要件と設計目標に適したタイプを選択することが重要です。
ソフトウェア開発に関連する人気記事を読む
無料のテクノロジー コースをチェックして、競争で優位に立ちましょう。
継承を使用する際に留意すべき重要事項:
継承は C++ の強力なメカニズムですが、実装時に考慮すべき要素がいくつかあります。
- 深い継承階層を避ける: 深い継承階層は、読み取り、理解、保守が困難なコードにつながる可能性があります。コードの可読性と保守性を向上させるために、継承階層をできるだけ浅くしてください。
- アクセス修飾子を賢く使用する:アクセス修飾子 (public、protected、および private) は、クラス内のデータ メンバーとメンバー関数の可視性を制御します。それらを賢く使用して、クラスの外部に表示されるべきではない実装の詳細を公開しないようにします。
- ダイヤモンド継承の回避:ダイヤモンド継承は、クラスが同じ基本クラスから継承する 2 つのクラスから継承する場合に発生します。これはあいまいさにつながる可能性があり、通常は避けるのが最善です。
- 継承の使いすぎを避ける:継承は便利ですが、使いすぎないようにすることが重要です。場合によっては、コンポジションやその他のデザイン パターンの方が適している場合があります。
ソフトウェア開発の無料コースをご覧ください
クラウド コンピューティングの基礎 | JavaScript の基本をゼロから | データ構造とアルゴリズム |
ブロックチェーン技術 | 初心者向けの反応 | コア Java の基本 |
ジャワ | 初心者向け Node.js | 高度な JavaScript |
取り除く
要約すると、継承は、すべてのプログラミング学生が習得すべき C++ プログラミングの重要な概念です。 さまざまな種類の継承とその使用例を理解することで、効率的で整理された保守可能なコードを作成できるようになり、より優れたソフトウェア開発者になることができます。
この記事が興味深いと感じた場合は、 IIIT バンガロールと共同で提供されるupGrad の DevOps 認定プログラムに登録することで、ソフトウェア開発の知識をさらに深めることができます。 このプログラムは、コーディング、テスト、展開など、ソフトウェア開発のさまざまな側面をカバーし、業界で熟練したソフトウェア開発者になるのに役立ちます。
C++ プログラミングで継承が重要なのはなぜですか?
継承を利用することで、プログラマーはソフトウェア開発の時間と労力を節約し、複雑なソフトウェア システムを体系的に構築できます。 プログラマーがより読みやすいコードの作成に取り組むにつれて、コーディングのプロセスは多様化して単純化されます。
C++ プログラミングで継承を使用する際に覚えておくべき重要なことは何ですか?
C++ プログラミングで継承を使用する場合、深い継承階層を回避する、アクセス修飾子を賢く使用する、ダイヤモンド継承を回避する、継承を使いすぎないなど、いくつかの重要なことに留意することが不可欠です。
ソフトウェア開発プロジェクトでは、どのタイプの継承を使用する必要がありますか?
継承の正しいタイプの選択は、特定のソフトウェア開発プロジェクトの要件と設計目標によって異なります。 さまざまな種類の継承からの選択は、プロジェクトの要件に完全に依存します。 したがって、先に進む前に詳細な分析を行ってください。