1. ホーム
  2. c++

[解決済み] C++で、仮想基底クラスとは何ですか?

2022-03-21 11:38:06

質問

を知りたいのですが。 仮想基底クラス "とは何か、その意味を教えてください。

例を挙げてみよう。

class Foo
{
public:
    void DoSomething() { /* ... */ }
};

class Bar : public virtual Foo
{
public:
    void DoSpecific() { /* ... */ }
};

解決方法は?

仮想基底クラスは、多重継承の際に、継承階層に複数のクラスのインスタンスが出現することを防ぐためのものです。

次のようなシナリオを考えてみましょう。

class A { public: void Foo() {} };
class B : public A {};
class C : public A {};
class D : public B, public C {};

上記のクラス階層の結果、"dreaded diamond"は、次のようになります。

  A
 / \
B   C
 \ /
  D

Dのインスタンスは、Aを含むBと、同じくAを含むCで構成されることになります。

このようなシナリオがある場合、曖昧さが生じる可能性があります。こうするとどうなるか。

D d;
d.Foo(); // is this B's Foo() or C's Foo() ??

この問題を解決するために、仮想継承があるのです。クラスを継承する際にvirtualを指定すると、コンパイラに「インスタンスは1つだけでいい」と伝えることになる。

class A { public: void Foo() {} };
class B : public virtual A {};
class C : public virtual A {};
class D : public B, public C {};

これは、階層に含まれるAの"instance"は1つだけであることを意味します。したがって

D d;
d.Foo(); // no longer ambiguous

これはミニ要約です。より詳細な情報は これ これ . 良い例もあります こちら .