問題タブ [diamond-problem]
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++ - C++での仮想関数なしの多重継承
私はダイヤモンドの問題に遭遇し、単一のダイヤモンドを使用したさまざまなケースでさまざまな解決策を見つけました。しかし、私は「連鎖」ダイヤモンドの解決策を見つけることができませんでした。
構造によると:はい、私は毎回複数のベースクラスを持ちたいので、仮想継承は解決策ではありません(それはダイヤモンドと呼ばれることさえありますか?)。また、ダイヤモンドのすべての中間層のget/set-functionsを避けたかったのです。
親クラスのvalへのアクセスは、次のように機能するようになりました。
しかし、次の「連鎖」ダイヤモンドについてはどうでしょうか。
経由でvalにアクセスする:
結果:
なんで?値へのルートが明確に定義されていませんか?
c++ - ひし形の多形継承:最も派生したクラスのサイズ
ダイアモンド型の継承はあいまいさを引き起こし、継承を使用することで回避できることを理解してvirtual Base Classes
います。問題はそれに関するものではありません。問題は、クラスがポリモーフィックである場合の、ひし形の階層で最も派生したクラスのサイズについてです。サンプルコードとサンプル出力は次のとおりです。
私が得る出力は次のとおりです。
私が理解しているようBase
に、仮想メンバー関数が含まれているため、
この環境では、sizeof Base=vptrのサイズ=4です。
Derived1
ケースとDerived2
クラスも同様です。
上記のシナリオに関連する私の質問は次のとおりです。クラスオブジェクト
のサイズはどうDerived3
ですか。Derived3クラスに2つのvptrがあるということですか?
クラスはこれらの2つのvptrでどのDerived3
ように機能しますか、それが使用するメカニズムについてのアイデアはありますか?
クラスのsizeofは、コンパイラの実装の詳細として残され、標準では定義されていません(仮想メカニズム自体はコンパイラの実装の詳細であるため)?
prolog - Flora-2 ダイヤモンド継承
Flora-2 は奇抜な言語であり、これが実現不可能であることは承知していますが、Flora-2 に関するアクティブなリソースが見つからないため、ここで試しています。とても人気があります...スタックオーバーフロータグはありません。Flora-2 と XSB Prolog の現状と今後について何かご存知でしたら、ぜひ教えてください。
Flora-2 ダイヤモンドの継承規則について説明してもらえますか? マニュアルには例がありますが、例の結果は示されていません。言い回しは、インタープリターと diamond.flr デモで見たものとは反対のようです。デモは次のとおりです。
(私が見ているのは、基本クラス c の有無にかかわらず発生します)
マニュアルには次のように書かれています。
アリティ > 1 のメソッドのレベルでは、2 つの異なるスーパークラスにアタッチされた同じメソッドの 2 つの上書きされていない定義がある場合、競合が発生したと見なされます。競合が発生したかどうかを判断するとき、メソッドの引数は無視されます。たとえば、
メソッド m がオブジェクト k に適用される場合と、オブジェクト u に適用される場合がありますが、多重継承の競合が発生しています。
(アリティ >= 1 を意味していると確信していますが、結果はアリティ 2 でも同様です)
したがって、 f の継承には競合があるため、未定義であることを意味します(「未定義」の意味について少し混乱していますが、関連するセクションでは「継承は行われません」と述べています)。ダイヤモンドを実行すると、次のようになります。
私は最初の解決策だけを期待していましたが、2番目の解決策にも解決策があれば、少なくともある程度意味があると思います
...しかし、そうではありませんでした。
参考までに、私は最新の安定版 XSB と最新の Flora-2 リリースを使用しています... 0.95.
c++ - C++ の多重継承 - なぜ機能しないのですか?
興味深い多重継承の問題を理解しようとしています。
祖父母は、複数のメソッドを持つインターフェイス クラスです。
次に、このインターフェースを部分的に完成させる抽象クラスがあります。
私が使用したいクラスは、両方の親から継承し、ディレクティブを使用して、どのメソッドがどこから来る必要があるかを指定します。
DI をインスタンス化しようとすると、抽象クラスをインスタンス化しようとするとエラーが発生します。
誰かが問題を理解し、部分的な実装を最大限に活用する方法を教えてもらえますか?
c++ - C++ の多重継承について質問がありますか?
次のコードがあります。
プログラムを実行すると、次の結果が得られます。
理解できません。Student と Staff の両方が Person から名前を継承しているのに、 との住所がLine 1
とLine 2
異なるのはなぜですか?Line 3
c++ - ダイヤモンド階層のダウンキャスト
static_cast
仮想ベースからダウンキャストできないのはなぜですか?
g ++ 4.5によると:
解決策は使用することdynamic_cast
です?しかし、なぜ。合理的なものは何ですか?
-編集-
以下の非常に良い答え。ただし、サブオブジェクトとvtableがどのように順序付けられるかを正確に説明する回答はありません。次の記事は、gccのいくつかの良い例を示しています:
http ://www.phpcompiler.org/articles/virtualinheritance.html#Downcasting
c++ - 単一の仮想継承では、恐ろしいダイヤモンドの問題を解決できないのはなぜですか?
上記のコーディングを行っても、コンパイラは次のD2
ことも要求しますvirtual
。
私が理解していないのは、(経由で)コンパイラB
にプロンプトを表示virtual
した後、なぜそれがまだ曖昧なのかということです。DD
D1
i
(私の記憶が正しければ、古いVC++(2006年)は、単一virtual
継承だけでこれを理解するのに十分な能力がありました)
c++ - C++ ダイヤモンドの問題を解決する
最初に見つかった継承された宣言を使用するだけで、ダイヤモンドの問題を解決できないでしょうか? つまり、
forが最初にリストされているためclass D
、デフォルトで(あいまいな場合) ifを使用することはできませんか? UNIX やその他の OS で PATH 環境変数がどのように機能するか。PATH 変数内の異なる場所に同じ名前の 2 つのものが存在する場合、最初の場所がデフォルトで使用されます (別の方法で修飾されていない限り)。B
B::getInt()
D::getInt()
編集:「最初の」継承された宣言により、単純な左から右の深さ優先順に従うことを意味します
編集#2:上記の実装をよりダイヤモンドのように更新しました。
java - Java でダイヤモンドの問題をシミュレートする方法を用意する
Javaでダイヤモンドの問題をシミュレートする方法はありますか? インターフェース付き?
ありがとう、セルソ
c++ - 優位性警告による C++ 継承
多くのインターフェイスを実装するかなり大きなオブジェクトを実装しようとしています。これらのインターフェイスの一部は、純粋な仮想です。ダイヤモンドの継承に問題がある可能性があります。Visual Studio は の警告を報告していますC4250 ('class1' : inherits 'class2::member' via dominance)
。まず第一に、これらのクラスは本来あるべき姿で事実上継承されます。以下は、この問題の原因となる部分クラスの設計です。
このツリー全体では、D のみが仮想メソッドを実装しており、問題のメソッドの他の定義はありません。また、B のすべての仮想メソッドが警告にリストされます。重要な場合、D は完全なクラスです。
これはBoostシリアライゼーションで発生することを読みましたが、警告を無視しても安全です。
私が達成しようとしているこの方法は有効ですか?この警告を無視しても安全ですか?
注 1:これはVisual Studio Compiler warning C4250 ('class1' : inherits 'class2::member' via dominance)の複製ではありません。そこで提案された解決策を試しました。
注 2:クラス図も送信できますが、これよりも少し複雑です。
編集: 完全な警告は次のとおりです。
gge::resource::ImageResource
は Big in the drawing、gge::graphics::ImageTexture
は D、drawin は、私が警告を受ける 6 つのメソッドの 1 つです。