仮想継承 | Programming Place Plus 用語集

トップページ用語集

名称 🔗

解説 🔗

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で書く
rss1.0 取得ボタン RSS 管理者情報 プライバシーポリシー
先頭へ戻る