C++ での多重継承

胡金庫 2023年10月12日
  1. 多重継承を使用して、指定された 2つのクラスの複数のプロパティを別のクラスに適用する
  2. virtual キーワードを使用して、基本クラスの複数のコピーを修正する
C++ での多重継承

この記事では、C++ で多重継承を使用する方法に関する複数の方法を示します。

多重継承を使用して、指定された 2つのクラスの複数のプロパティを別のクラスに適用する

C++ のクラスは多重継承を持つことができます。これにより、複数の直接基本クラスからクラスを派生させることができます。

これは、クラスが注意深く実装されていない場合、特に異常な動作が発生する可能性があることを意味します。たとえば、クラス C がクラス BA から派生している次のスニペットコードについて考えてみます。それらはすべて、特別な文字列を出力するデフォルトのコンストラクターを持っています。ただし、mainc 関数で C タイプのオブジェクトを宣言すると、3つのコンストラクターが出力を出力します。コンストラクターは、継承されたのと同じ順序で呼び出されることに注意してください。一方、デストラクタは逆の順序で呼び出されます。

#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::string;

class A {
 public:
  A() { cout << "A's constructor called" << endl; }
};

class B {
 public:
  B() { cout << "B's constructor called" << endl; }
};

class C : public B, public A {
 public:
  C() { cout << "C's constructor called" << endl; }
};

int main() {
  C c;
  return 0;
}

出力:

Bs constructor called
As constructor called
Cs constructor called

virtual キーワードを使用して、基本クラスの複数のコピーを修正する

次のプログラムは、Planet クラスコンストラクターの 2つのインスタンス、それぞれ Mars および Earth コンストラクター、そして最後に Rock クラスコンストラクターを出力することに注意してください。また、オブジェクトがスコープ外になると、Planet クラスのデストラクタが 2 回呼び出されます。しかし、この問題は MarsEarth クラスに virtual キーワードを追加することで解決できます。クラスに複数の基本クラスがある場合、派生クラスが 2つ以上の基本クラスから同じ名前のメンバーを継承する可能性があります。

#include <iostream>

using std::cin;
using std::cout;
using std::endl;
using std::string;

class Planet {
 public:
  Planet(int x) { cout << "Planet::Planet(int ) called" << endl; }
};

class Mars : public Planet {
 public:
  Mars(int x) : Planet(x) { cout << "Mars::Mars(int ) called" << endl; }
};

class Earth : public Planet {
 public:
  Earth(int x) : Planet(x) { cout << "Earth::Earth(int ) called" << endl; }
};

class Rock : public Mars, public Earth {
 public:
  Rock(int x) : Earth(x), Mars(x) { cout << "Rock::Rock(int ) called" << endl; }
};

int main() { Rock tmp(30); }

出力:

Planet::Planet(int ) called
Mars::Mars(int ) called
Planet::Planet(int ) called
Earth::Earth(int ) called
Rock::Rock(int ) called
著者: 胡金庫
胡金庫 avatar 胡金庫 avatar

DelftStack.comの創設者です。Jinku はロボティクスと自動車産業で8年以上働いています。自動テスト、リモートサーバーからのデータ収集、耐久テストからのレポート作成が必要となったとき、彼はコーディングスキルを磨きました。彼は電気/電子工学のバックグラウンドを持っていますが、組み込みエレクトロニクス、組み込みプログラミング、フロントエンド/バックエンドプログラミングへの関心を広げています。

LinkedIn Facebook

関連記事 - C++ Class