問題タブ [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.

0 投票する
3 に答える
5245 参照

c++ - 支配による継承 - それは本当に悪いことですか?

私は、自分のコードを警告なしでコンパイルする必要がある人の 1 人です。通常、私はコンパイラを尊重し、警告が表示された場合は、コードを少し修正する必要があるというサインと見なします。与えられた警告を無視するようにコンパイラーに指示しなければならない場合、私は少しひきつります。

しかし、これは私が回避できないようであり、私が言えることから、私は何も「悪い」ことをしていません. これは悪いデザインだと思う人はいますか?特に厄介な点は見当たりませんが (「邪悪なダイヤモンド」を除いて)、完全に有効で有用なコードです。しかし、(MSVC で) レベル 2 の警告が生成されます!

Quux オブジェクトを作成すると、Bar::foo 実装を呼び出すことが期待されます。MSVC は非常に役に立ちます。あいまいさが足りないと警告してくれます。

警告 C4250: 'Quux': 優性経由で 'Bar::Bar::foo' を継承します

これで、プラグマを使用してこの警告をオフにできることがわかりましたが、それは私がここで尋ねようとしている質問ではありません。ここでコンパイラに耳を傾ける必要がある理由はありますか、それとも非常に熱心な警告ですか?

0 投票する
3 に答える
2813 参照

c++ - コンパイラはC++のダイヤモンド問題を内部的にどのように解決しますか?

仮想継承を使用して菱形継承問題を解決できることはわかっています。

例えば:

このコードをコンパイルすると、あいまいなエラーが発生します。ここで私の質問は、コンパイラがこのあいまいさの問題(菱形継承問題)を内部でどのように検出するかです。

0 投票する
3 に答える
11547 参照

c++ - 多重継承と純粋仮想関数

次のコード:

次のエラーでコンパイルに失敗します。

私はそれをいじってみて、「interface->interface_base」と「implementation_base->interface_base」の継承を仮想化すると問題が解決することを理解しましたが、理由はわかりません。誰かが何が起こっているのか説明してもらえますか?

psコードを短くするために、意図的に仮想デストラクタを省略しました。それらを入れるように私に言わないでください、私はすでに知っています:)

0 投票する
1 に答える
95 参照

c++ - C++: ダイヤモンドの問題

簡単な質問: このヒエラルキーは DP を引き起こしますか?

0 投票する
1 に答える
681 参照

c++ - 継承修飾子が混在するダイヤモンド継承 (protected / private / public)

class A,B,C,DA がベースで、B、C がその間にあり、D がダイヤモンド モデルで派生した場所があるとします。

ノート:

class Bプライベートモードでvirtualyclass Aを継承し、

class C保護モードでvirtualyclass Aを継承します。

メンバーのインスタンスを作成すると、class Dメンバーはどうなるでしょうか。プライベートまたは保護された笑?

フィギュア No2:

そのようにするとどうなるでしょうか:

memberこの2番目の例では公開されると思いますよね?

0 投票する
4 に答える
252 参照

c++ - Multiple instances of a virtual base class subobject (really) -- no way?

Given the code:

can we make the second assert fail?

In other words, this is the case when we have a two-diamond inheritance graph and would like to have separate subobjects for both diamonds' tops in the most derived object.

The standard (2003, 10.1.4) wording seems to prohibit this, and if really so, the follow-up question is: are we given no means of precise virtual-over-multiply-included subobject structure manipulation, and why?

0 投票する
5 に答える
3815 参照

java - 今後のJava8リリースでの仮想拡張メソッド

次のようなコードスニペットを見ると

一つ質問があります。Javaで十分なsh*tをすでに取得していませんか?なぜこれが必要なのですか?

0 投票する
1 に答える
1233 参照

c++ - ひし形の多重継承パターン

以下は、多重継承で直面するひし形の問題です。

私が得る出力は

  1. 空のベース コンストラクター
  2. Derived2 1 つの引数コンストラクター
  3. Derived1 1 つの引数コンストラクター
  4. 派生コンストラクター
  5. 空の派生デストラクタ
  6. 空の Derived2 デストラクタ
  7. 空の Derived1 デストラクタ
  8. 空のベース デストラクタ

私のderObjパラメータ、つまり「可能であればこれを印刷してください」が印刷されず、出力が似ていないのはなぜだろうか

  1. 空のベース コンストラクター
  2. Derived2 1 つの引数コンストラクター
  3. できればこれを印刷してください!
  4. Derived1 1 つの引数コンストラクター
  5. 派生コンストラクター
  6. 空の派生デストラクタ
  7. 空の Derived2 デストラクタ
  8. 空の Derived1 デストラクタ
  9. 空のベース デストラクタ
0 投票する
2 に答える
513 参照

python - pythonとsuperで同じメンバーを持つクラスのダイヤモンド継承

私はひし形の継承という奇妙な状況に陥っています。さらに悪いことに、ひし形の真ん中にあるクラスがメンバーを共有しています。以下に、私の問題を強調するコードの切り詰めを示しました。

組み込み関数の python ドキュメント サイトにリンクされているhttp://rhettinger.wordpress.com/2011/05/26/super-considered-super/から学んだクラスの作成に使用した方法super

出力を与える

問題は、キーワード引数を使用して関数のシグネチャが一致することを確認する方法が、クラス C の init 呼び出しから z 引数を奪うことです。引数を kwargs に強制的に追加することはできますが (コメント付きのコードを参照)、これにより、型 B のオブジェクトをインスタンス化できなくなります。これは、パラメーターを取らないオブジェクトの init への呼び出しになるためです。以下のオブジェクトのいずれかをインスタンス化するときに無効な引数を入れるのを防ぐため、素晴らしい機能です。

また、変数を設定する前にスーパー行があると、最高レベルのオブジェクトが下位レベルを上書きするため、問題が修正されることに気付きました。ただし、実際のすべての「設定」は下位レベルのクラスによって実行され、上位レベルのクラスは継承のチェーンに設定される値を渡すため、私のコードは最後にスーパーを中心に構築されています。親の呼び出しのどこに収まるかについてのガイドラインはありますか?

何かアイデアはありますか?

ありがとう

ps これは「共同クラス」の設計が悪いだけですか? 協力クラスとは正確には何ですか?従うべき規則やガイドラインはありますか?

編集:

Stackoverflow では自分の質問に答えることはできませんが、解決策を思いつきました。

協同クラス間で共有メンバーが存在するべきではないと思います。メンバーを共有する、互いに独立している 2 つのクラスが存在する場合 (「ある種類」の関係がないという意味で)、継承関係に抽象化のレベルを追加する必要があります。

共有メンバーを取り出して、共有基本クラスから継承し、ひし形のクラスによって継承される別のクラスに配置する必要があります。

以下、修正したコードです。OPのリンクに合わせて、ルート基本クラスを導入しました

私は正式なプログラミング教育を受けていないことを指摘する必要があります (ここで私が推測するほとんどのように) ので、間違った用語を使用した場合は申し訳ありません.

0 投票する
2 に答える
3747 参照

c++ - Virtual Inheritance and dreaded diamond

I am having a hard time with a dreaded diamond problem. For a reminder, here is the classical class hierarchy of this problem:

To solve it, the standard solution is to make C1 and C2 use virtual inheritance to inherit from B.

My problem is that B and C1 are from an SDK that I cannot modify. Example below where I cannot make SubClassB inherit virtually from Base. Classes: PureVirtualBase, Base and SubClassB are from the SDK I use. I cannot modify them. SubClassA and Leaf are my custom classes. I can change them.

In such a situation where SubClassB cannot be changed to use virtual inheritance from Base. How what should so that:

  • Leaf instance only contains one Base
  • Avoid the ambiguity when trying to access functions defined pure virtual in PureVirtualBase and implemented in Base
  • If I comment the call to f_PurevirtualBase it compiles but I have a warning that virtual base 'Base' inaccessible in 'Leaf' due to ambiguity If I uncomment this call: I get this error : request for member 'f_PureVirtualBase' is ambiguous
  • If I prefix this call by the class name (myleaf.SubClassA::f_PureVirtualBase() then it works, but something is obviously wrong as there are 2 Base contained in the Leaf Object).

Any hint?

More info to answer comments

My target architecture is slightly more complex that the sample I provided in the original question:

LeafOne : inherits from SubClassA and SubClassB(SDK)

LeafTwo : inherits from SubClassA and SubClassC(SDK)

LeafThree : inherits from SubClassA and SubClassD(SDK)

SubClassA is my own private code. It provides custom functions. It should be able to be treated like a Base instance by SDK methods. This class won't be instantiated but it is here to be able to handle LeafOne, LeafTwo and LeafThree in the same when performing some treatment.