問題タブ [virtual-inheritance]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - ひし形の多形継承:最も派生したクラスのサイズ
ダイアモンド型の継承はあいまいさを引き起こし、継承を使用することで回避できることを理解してvirtual Base Classes
います。問題はそれに関するものではありません。問題は、クラスがポリモーフィックである場合の、ひし形の階層で最も派生したクラスのサイズについてです。サンプルコードとサンプル出力は次のとおりです。
私が得る出力は次のとおりです。
私が理解しているようBase
に、仮想メンバー関数が含まれているため、
この環境では、sizeof Base=vptrのサイズ=4です。
Derived1
ケースとDerived2
クラスも同様です。
上記のシナリオに関連する私の質問は次のとおりです。クラスオブジェクト
のサイズはどうDerived3
ですか。Derived3クラスに2つのvptrがあるということですか?
クラスはこれらの2つのvptrでどのDerived3
ように機能しますか、それが使用するメカニズムについてのアイデアはありますか?
クラスのsizeofは、コンパイラの実装の詳細として残され、標準では定義されていません(仮想メカニズム自体はコンパイラの実装の詳細であるため)?
c++ - 非仮想ベースメソッドを呼び出すときに、C ++で仮想継承のペナルティ/コストはありますか?
基本クラスから通常の関数メンバーを呼び出すと、C ++で仮想継承を使用すると、コンパイルされたコードで実行時のペナルティが発生しますか?サンプルコード:
c++ - 多重継承でvptrを理解していますか?
本の効果的なc ++のステートメントを理解しようとしています。以下は、多重継承の継承図です。
現在、この本には、vptr には各クラスに個別のメモリが必要であると書かれています。また、次のステートメントを作成します
上の図の奇妙な点は、4 つのクラスが関係しているにもかかわらず vptr が 3 つしかないことです。実装は、必要に応じて 4 つの vptr を自由に生成できますが、3 つあれば十分です (B と D が vptr を共有できることがわかります)。ほとんどの実装では、この機会を利用して、コンパイラが生成するオーバーヘッドを削減します。
vptr の各クラスに個別のメモリが必要な理由がわかりませんでした。vptr は、継承タイプが何であれ、基本クラスから継承されることを理解していました。継承されたvptrを使用して結果のメモリ構造を示していると仮定すると、どのようにステートメントを作成できますか
B と D は vptr を共有できます
誰かが多重継承の vptr について少し明確にしてくれませんか?
- クラスごとに個別の vptr が必要ですか?
- また、上記が当てはまる場合、B と D が vptr を共有できるのはなぜですか?
c++ - 仮想継承は例外に必要ですか?
多重継承を使用する場合に仮想継承が必要であることは理解しています。これにより、恐ろしいダイヤモンド問題が解決されます。
しかし、多重継承を使用していない場合はどうなるでしょうか? 仮想継承の必要性はまったくありますか?
例外 (派生クラスのスロー、基底クラス参照によるキャッチ) にとって重要であると聞いたことを覚えているようです。しかし、それには仮想デストラクタで十分ではないでしょうか?
これでかつて見た参考ページを探してみたのですが、なかなか見つかりません。
c++ - ダイヤモンド階層のダウンキャスト
static_cast
仮想ベースからダウンキャストできないのはなぜですか?
g ++ 4.5によると:
解決策は使用することdynamic_cast
です?しかし、なぜ。合理的なものは何ですか?
-編集-
以下の非常に良い答え。ただし、サブオブジェクトとvtableがどのように順序付けられるかを正確に説明する回答はありません。次の記事は、gccのいくつかの良い例を示しています:
http ://www.phpcompiler.org/articles/virtualinheritance.html#Downcasting
c++ - 仮想基底クラスを持つクラスのサイズ
重複の可能性:
仮想のオブジェクト サイズ
GCCコンパイラにsizeof(class)が12を出力する理由 誰かが説明しますか?
.net - (Winform) ビジュアル継承ツリーをマージする方法
私は4つのWinFormアプリを持っています。Form1 は baseForm から継承し、Formv2 は Formv1 から継承し、v3 は v2 から、v4 は v3 から継承します。タブを含む多くのタブにまたがる約 2,000 のコントロールがあります。
これは、Visual Studio 2008 を実際に停止させ、頻繁にクラッシュさせ、一般的にひどいパフォーマンスを引き起こします。
baseForm からのみ継承するが、formsv1 から v4 までのすべてのビジュアル レイアウト (すべて) を含む FormV5 を作成したいと考えています (baseForm にはコントロールはありません)。
フォームごとの違いは、主に新しいコントロールの追加であり、一部の古いコントロールは移動または非表示にする必要があり、またはいくつかのラベルがあちこちで変更されています。
これを行うプログラム的な方法を提案できる人はいますか? formV4 で実行時にリフレクションなどを使用してコードを生成する方法 (formV4 コントロール、レイアウト、およびプロパティをダンプする) のように、formV5.designer.vb.file にカット アンド ペーストできますか?
(注意してください、これは約 5 年前のエンタープライズ プロジェクトであり、変更を加えるたびにすべてのクライアント (病院) にプッシュする必要があります。自動化されたテストや単体テストがないため、これを入手する必要があります。右 :) )
ありがとうジョナサン
実際の formlogic 仮想メンバーをすべてマージすることは、手動で管理できるはずです。
c++ - 未完成のクラス階層の「最終」クラスでの仮想継承の使用
現在「最下位」にある (つまり、最も派生している) 未完成のクラス階層で仮想クラスを先制的に派生させることは、害がありますか、それとも悪い設計と見なされますか? 仮想継承が実際に必要になるまで (つまり、誰かが階層を拡張することを決定し、その結果がダイヤモンドになるまで) 待つ正当な理由はありますか?
c++ - クラスの VTT とは何ですか?
最近、初めての C++ リンカ エラーに遭遇しました。
エラーを認識して問題を修正しましたが、まだしつこい質問があります: VTT とは正確には何ですか?
余談ですが、興味のある方のために説明すると、クラスで宣言された最初の仮想関数を定義し忘れた場合に問題が発生します。vtable は、クラスの最初の仮想関数のコンパイル ユニットに入ります。その関数を定義するのを忘れると、開発者にとってはるかに使いやすい関数が関数を見つけられないのではなく、vtable が見つからないというリンカ エラーが発生します。
c++ - C++ の静的仮想関数
基本クラスと派生クラスがあり、他の関数に静的として渡す必要があるため、それらを静的に保ちながら基本関数を変更したいと考えています。
どうやってやるの?