C++ の多重継承のかたちの1つで、祖先にあたるクラス(つまりスーパークラスのスーパークラス)のメンバを複数回継承してしまう問題を対処するものです。
多重継承では、異なる2つ以上のスーパークラスが、それらの共通の祖先(さらに上位に来るスーパークラス)を持つような複雑な継承構造を生み出してしまうことがあり、祖先のメンバを重複して引き継ぐなど、取り扱いに難しさがあります。
C++ で次の例のような多重継承を行うと、クラスC の位置からみると、クラスA のメンバを、クラスB1、クラスB2 のそれぞれから別個のものとして引き継ぐことになります。
class A { public a; };
class B1 : public A {};
class B2 : public A {};
class C : public B1, public B2 {};
この場合、クラスC のオブジェクトco
があるとして、co.a
は曖昧であるということになり(B1
に引き継がれた a なのか、B2 に引き継がれた a なのか判断できない)、コンパイルエラーを起こします。
仮想継承という特別なかたちの多重継承を用いると、重複を排除することができます。多重継承の継承元になる2つの基底クラス(ここでは
B1、B2)が、さらに上位にあたるクラスA
から継承するとき、public virtual
のように
virtualキーワードを使って指示を与えることで仮想継承が行えます。
class A { public a; };
class B1 : public virtual A {};
class B2 : public virtual A {};
class C : public B1, public B2 {};
この場合、クラスC は、B1 の基底クラスである A と、B2
の基底クラスである A
を別々の存在として扱わなくなり、メンバの重複が解消されます。そのため、さきほどの
co.a
の曖昧さはなくなります。
C++ の多重継承や仮想継承についての解説が、C++編【言語解説】第30章にあります。
Programming Place Plus のトップページへ
はてなブックマーク に保存 | Pocket に保存 | Facebook でシェア |
X で ポスト/フォロー | LINE で送る | noteで書く |
RSS | 管理者情報 | プライバシーポリシー |