C++
 Computer >> コンピューター >  >> プログラミング >> C++

【C++入門】多重継承の基本と実装方法をわかりやすく解説

多重継承(Multiple Inheritance)とは

多重継承とは、ひとつのクラスが複数の基底クラス(親クラス)から派生する仕組みのことです。多重継承を利用することで、派生クラスは複数の基底クラスが持つ機能やデータメンバをまとめて引き継ぐことができます。これはC++に代表されるオブジェクト指向プログラミング言語における重要な機能のひとつです。

多重継承の構造を表した図が以下になります。

【C++入門】多重継承の基本と実装方法をわかりやすく解説

C++で多重継承を実装するサンプルプログラム

ここでは、C++で多重継承を実装したサンプルプログラムを紹介します。クラスCが、クラスAとクラスBの2つのクラスを同時に継承する例です。

サンプルコード

#include <iostream>
using namespace std;

class A {
    public:
    int a = 5;
    A() {
        cout << "Constructor for class A" << endl;
    }
};
class B {
    public:
    int b = 10;
    B() {
        cout << "Constructor for class B" << endl;
    }
};
class C: public A, public B {
    public:
    int c = 20;
    C() {
        cout << "Constructor for class C" << endl;
        cout<<"Class C inherits from class A and class B" << endl;
    }
};
int main() {
    C obj;
    cout<<"a = "<< obj.a <<endl;
    cout<<"b = "<< obj.b <<endl;
    cout<<"c = "<< obj.c <<endl;
    return 0;
}

実行結果

上記プログラムの実行結果は以下のとおりです。

Constructor for class A
Constructor for class B
Constructor for class C
Class C inherits from class A and class B
a = 5
b = 10
c = 20

プログラムの解説

まず、クラスAとクラスBを定義しています。それぞれ、publicなデータメンバ(a、b)を持ち、コンストラクタ内でメッセージを表示する処理が記述されています。

class A {
    public:
    int a = 5;
    A() {
        cout << "Constructor for class A" << endl;
    }
};
class B {
    public:
    int b = 10;
    B() {
        cout << "Constructor for class B" << endl;
    }
};

次に、クラスCはクラスAとクラスBの両方をpublic継承しています。これが多重継承の典型的な例です。クラスCの定義は以下のとおりです。

class C: public A, public B {
    public:
    int c = 20;
    C() {
        cout << "Constructor for class C" << endl;
        cout<<"Class C inherits from class A and class B" << endl;
    }
};

main()関数内では、クラスCのオブジェクトobjを生成しています。このとき、基底クラスA、Bのコンストラクタが宣言順に先に呼び出され、その後に派生クラスCのコンストラクタが呼び出されます。その後、各クラスのデータメンバであるa、b、cの値が順に出力されます。該当するコードは以下のとおりです。

C obj;
cout<<"a = "<< obj.a <<endl;
cout<<"b = "<< obj.b <<endl;
cout<<"c = "<< obj.c <<endl;

補足:ダイヤモンド継承に注意

多重継承は強力な機能である一方、同じ基底クラスを異なる経路で重複して継承してしまう「ダイヤモンド継承(菱形継承)」の問題が発生することがあります。この問題を回避するには、仮想継承(virtual継承)を使用します。多重継承を設計に取り入れる際は、継承関係が複雑になりすぎないよう注意しましょう。

  1. C++のローカルクラスとは?特徴・制約と実装例をわかりやすく解説

    ローカルクラスとは C++において、関数の中で宣言されたクラスは「ローカルクラス」と呼ばれます。これは、そのクラスが定義された関数の内部でのみ有効であるためです。 まず、ローカルクラスの基本的な構造を見てみましょう。 #include<iostream> using namespace std; void func() { class LocalClass { }; } int main() { return 0; } 上記の例では、関数 func() の中で LocalClass が定義されています。このように関数の内部で宣言されたクラスが、ローカルクラス

  2. C#の継承とは?基底クラスと派生クラスの基本を実例で解説

    継承(Inheritance)とは継承とは、既存のクラスをもとに新しいクラスを定義できるオブジェクト指向プログラミングの重要な仕組みです。継承を活用することで、アプリケーションの作成や保守が格段に容易になります。また、すでに実装済みのコード機能を再利用できるため、開発時間の短縮にも大きく貢献します。基底クラスと派生クラスの概念継承は「基底クラス(base class)」と「派生クラス(derived class)」という概念に基づいています。C#では、1つのクラスは複数のクラスから直接派生することはできませんが、複数のインターフェースを実装することは可能です。そのため、複数のインターフェースか