3

クラスが同じ基本クラスから派生した 2 つのクラスを継承する場合に、ダイヤモンド問題のような問題が発生しない状況で仮想継承が役立つ理由を理解できません。

まだ役立つ(または必要な)場合に、誰かが例や説明を教えてくれませんか?

ありがとう:)

4

3 に答える 3

3

仮想継承は、ひし形の継承の問題が発生する可能性がない場合にはあまり役に立ちません。その問題を解決するのが仮想継承です。奇妙なオブジェクトレイアウトと、ほとんどの派生クラスから最上位の基本初期化が呼び出されるという犠牲を払って。

仮想継承の最も一般的な実用的なアプリケーションは、インターフェイスです。

仮想継承を使用すると、実装で継承するJava 手法を使用できます。


C++03 では、最も派生したクラスから最上位のクラスを初期化する必要性に基づくハックである、仮想継承の追加の使用例がありました。

これらの使用例には次のものが含まれます。

  • クラスを継承不可にする。C++11 で
    解決されました。final

  • 特定の最も派生したクラス (テンプレート) の使用を強制します。
    C++11 では、メンバー関数などの共変機能は、cloneC++11 コンストラクター引数の転送を使用して中間継承を介してより簡単に追加できます。

于 2014-05-25T23:48:35.790 に答える
0

はい、C++11 より前の時代には、継承は同様のメカニズムvirtualを実装するのに役立ちました。final

// template style may not work with clang++
template<class T> struct Wrap { typedef T type; };
template<class Derived> class Final { // no one should inherit `D` from hereon
  Final () {}  
  friend class Wrap<Derived>::type;
};

class D : virtual Final<D> {}; // `virtual` inheritance
class D2 : public D {};  // if anyone tries to still inherit `D`

int main () {
  D d;
  D2 d2;  // <--- an expected error occurs upon object declaration
}

Bjarne Stroustrup のページを参照して、より単純ではあるが制限された方法を確認してください

于 2019-11-18T02:40:42.100 に答える