単一継承と多重継承
単一継承でis-a関係をモデル化し、多重継承の落とし穴に対処します。
「単一継承と多重継承」はCoddyKit上の無料C++ Academyレッスンです。 これはレッスン1/4です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはC++ Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 C++ Academyコースには全4レッスンが含まれています。
継承とは
継承を使うと、あるクラス(派生クラス)が別のクラス(基底クラス)を再利用し、拡張できます。「is-a」関係をモデル化する機能です。
class Animal {
public:
void breathe() { std::cout << "breathing\n"; }
};
class Dog : public Animal {
public:
void bark() { std::cout << "Woof!\n"; }
};public 継承
「is-a」関係(たとえば、Dog は Animal である)をモデル化するには public を使用します。メンバーのアクセスレベルは、派生クラスでも維持されます。
protected 継承と private 継承
protected 継承と private 継承は、「is-implemented-in-terms-of」関係をモデル化するためのもので、ほとんど使用されません。このような場合は、コンポジションを優先してください。
基底クラスのメンバーへのアクセス
派生クラスは、基底クラスの public メンバーまたは protected メンバーを直接使用できます。
Dog d;
d.breathe(); // inherited from Animal
d.bark(); // own memberコンストラクターの実行順序
基底クラスのコンストラクターは、派生クラスのコンストラクターより先に実行されます。基底クラスに引数を渡すには、メンバー初期化子リストを使用します。
class Pet : public Animal {
std::string name_;
public:
Pet(std::string n) : Animal(), name_(std::move(n)) {}
};デストラクターの実行順序
デストラクターは逆の順序で実行されます。派生クラスが先で、その後に基底クラスが実行されます。基底クラスのポインター経由で削除する場合は、基底クラスのデストラクターを virtual にしてください。
多重継承
C++ では、クラスが複数の基底クラスを継承できます。ただし設計が複雑になるため、慎重に使用してください。
class Printable { public: virtual void print() = 0; };
class Serializable { public: virtual std::string serialize() = 0; };
class Document : public Printable, public Serializable {
// implements both interfaces
};ダイヤモンド問題
2 つの基底クラスが共通の基底クラスを共有していると、派生クラスにはその基底クラスのコピーが 2 つ存在することになります。仮想継承で解決してください。
class A {};
class B : virtual public A {};
class C : virtual public A {};
class D : public B, public C {}; // D has ONE A, not two仮想継承のコスト
仮想基底クラスにはオーバーヘッドがあります。オブジェクトごとに追加のポインターが必要になり、基底クラスの各メンバーへアクセスするたびに追加の間接参照が発生します。可能な場合は避けてください。
コンポジションと継承
「has-a」のコンポジションは、「is-a」の継承より単純であることがよくあります。Car は Engine を持ちますが、Car を Engine から継承させてはいけません。
class Engine { /* ... */ };
class Car {
Engine engine_; // composition
};インターフェース継承と実装継承
一般的な用途は次の 2 つです。
- インターフェース — 純粋仮想基底クラスから派生して、コントラクトを満たします
- 実装 — コードを再利用するために派生します(CRTP、ミックスイン)
継承を使用する場合
次の場合に継承を使用してください。
- 実際の「is-a」関係が存在する
- 仮想関数によるランタイムポリモーフィズムが必要である
- 基底クラスが継承を前提に設計されている
理解度チェック
多重継承を使用したときに、共通の基底クラスが 2 つ存在するのを防ぐ手法はどれですか。
まとめ
継承は、public 継承によって「is-a」関係をモデル化します。多重継承は使用できますが、ダイヤモンド問題には仮想継承が必要です。「has-a」関係やコードの再利用には、コンポジションを優先してください。
よくある質問
「単一継承と多重継承」レッスンは無料ですか?
はい。「単一継承と多重継承」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、C++ Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 C++ Academyコースには全4レッスンが含まれています。
「単一継承と多重継承」で何を学びますか?
単一継承でis-a関係をモデル化し、多重継承の落とし穴に対処します。 ブラウザで直接実行するハンズオンコードでC++ Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。
C++ Academyを始めるのに経験は必要ですか?
事前経験は必要ありません。CoddyKitのC++ Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン1/4です。
「単一継承と多重継承」レッスンにはどのくらい時間がかかりますか?
ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。
このC++ Academyレッスンでコードを書いて実行できますか?
はい。すべてのC++ Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。