web-dev-qa-db-ja.com

仮想継承

「仮想」継承の意味は何ですか?

次のコードを見ましたが、次のコンテキストでキーワードvirtualの意味が理解できませんでした。

class A {};
class B : public virtual A;
56
Gal Goldman

仮想継承は、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
_
43
ogee