2016-08-24 14 views
5

C++共通の仮想基底クラスと2つのクラスを考えると仮想継承差

class Base {}; 

class Derived1 : public virtual Base {}; 

class Derived2 : public virtual Base {}; 

は、これら2つの別の派生クラスの間のいずれかの違い?:

  • class Derived3 : public virtual Base, public Derived1, public Derived2 {}; 
    
  • class Derived3 : public Derived1, public Derived2 {}; 
    
があります

最初のものも仮想ベースcから直接派生します私はそれがDerived1Derived2と共有されているので、何の効果もないと思います。

答えて

2

彼らは同じことを言う。唯一の違いは、とpublic Derived2を両方ともDerived3の定義から削除した場合でも、最初のものはBaseから継承され、2番目のものは継承しないということです。

編集:私はそこにあるとは思わないが、2人とも異なる行動をとる奇妙なクロスキャストの状況があるかどうかについては慎重に考えなかった。

2

これらの例では違いはありません。

もっと複雑なシナリオでは、継承された仮想ベースを直接継承すると、基本クラスのサブオブジェクトの構築/破壊の順序が変更される可能性があります。

1

仮想継承の目的は、Base(またはケース1では3つのコピー)の2つのコピーを避けることなので、オブジェクトのレイアウトに違いはないと思います。

だからこそ、違いはあなたの意図と本当にコードの読みやすさです。

関連する問題