「仮想」継承の意味は何ですか?
次のコードを見ましたが、次のコンテキストでキーワードvirtual
の意味が理解できませんでした。
class A {};
class B : public virtual A;
仮想継承は、DDD問題(派生に関する恐ろしいダイヤモンド)を解決するために使用されます。
同じ基本クラスから継承する2つのクラスがある次の例を見てください。
_class Base
{
public:
virtual void Ambig();
};
_
_class C : public Base
{
public:
//...
};
class D : public Base
{
public:
//...
};
_
次に、CクラスとDクラスの両方を継承する新しいクラスを作成します(両方ともBase :: Ambig()関数を継承しています)。
_class Wrong : public C, public D
{
public:
...
};
_
上記の「間違った」クラスを定義している間、実際にはDDD(Diamond Derivation problem)を作成しました。
_Wrong wrong;
wrong.Ambig();
_
これは2回定義されているため、あいまいな関数です。
_Wrong::C::Base::Ambig()
_
そして:
_Wrong::D::Base::Ambig()
_
この種の問題を防ぐには、仮想継承を使用する必要があります。仮想継承は、正しいAmbig()
関数を参照することを知っています。
だから-定義:
_class C : public virtual Base
class D : public virtual Base
class Right : public C, public D
_