0Pricing
C++ Academy · レッスン

単一継承と多重継承

単一継承で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フィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 単一継承と多重継承
  2. 仮想関数とvtable
  3. 抽象クラスと純粋仮想メソッド
  4. 継承とコンポジションのトレードオフ
← C++ Academyに戻る