C++ での多重継承
胡金庫
2023年10月12日
![C++ での多重継承](/img/Cpp/ag-feature-image---multiple-inheritance-in-cpp.webp)
この記事では、C++ で多重継承を使用する方法に関する複数の方法を示します。
多重継承を使用して、指定された 2つのクラスの複数のプロパティを別のクラスに適用する
C++ のクラスは多重継承を持つことができます。これにより、複数の直接基本クラスからクラスを派生させることができます。
これは、クラスが注意深く実装されていない場合、特に異常な動作が発生する可能性があることを意味します。たとえば、クラス C
がクラス B
と A
から派生している次のスニペットコードについて考えてみます。それらはすべて、特別な文字列を出力するデフォルトのコンストラクターを持っています。ただし、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 回呼び出されます。しかし、この問題は Mars
と Earth
クラスに 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
著者: 胡金庫