問題タブ [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 投票する
4 に答える
1957 参照

c++ - C++ 多重継承

ここで、このコードのワーカーの非常に奇妙な階層について質問しないでください。なぜ誰かがこのようなものを欲しがるのかわかりませんが、完全に理解していることを確認するために、多重継承の演習を行うことにしました。これが結果です。

私がここでやろうとしていることを理解していただければ幸いです。「派生クラス 'Supervisor' と基本クラス 'Employee' の間のあいまいな変換」について何かを得ています。

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

c++ - 多重継承で継承されたデータ メンバーへのポインター

多重継承を持つクラスからデータ メンバーへのポインターを取得する方法があるかどうかを確認しようとしています。それらを明確にして正しいオフセットを取得する方法はありますか?

編集:私はそれらを2つの独立した値にしたいのですが、両方

継承ツリーが仮想でない場合、同じ値が得られますが、異なるオフセットであってはなりませんか?

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

c++ - ダイヤモンド継承が存在する場合の冗長な関数呼び出しの防止

ダイヤモンドの継承が存在する場合に冗長な関数呼び出しを防ぐための良い戦略は何ですか? 具体的には、次のプログラムがあるとします。

d.print() を呼び出すと、次のようになります。

ここで、a が 2 回印刷されています。これを防ぐ良い方法はありますか?確かに、次のようなコードを使用して接続を手動で配線できます。

正しく出力する

しかし、もっと良い方法があるかどうか知りたいです。これがどこで発生するかという観点から、オブジェクト A、B、C、および D が複雑であり、それら自体をディスクに書き込むことができる必要がある状況を想像してください。各 A、B、C、および D の出力コードを 1 回だけ記述したいだけであり、D が A に関する情報を 2 回記述しないことが重要です。

<---編集--->

この問題を解決する方法はあと 2 つありますが、まだわかりにくいものです。最初のものはクリスチャンからのもので、A が印刷されているかどうかにフラグを設定することを含みます。

これは正しく出力されます。2 番目の方法はより複雑ですが、構造が大きくなる可能性があります。基本的に、クラスからプリンターを分離し、各オブジェクト内にプリンターのリストを登録します。印刷したいときは、プリンターのリストを反復処理し、正しい出力を提供します。これはあまりにも多くの機械を使用していると思いますが、他の誰かがより良いアイデアを得る場合に備えて含めます:

<---編集2--->

tmpearce は、ハッシュ テーブルを組み立てる前に、すべての情報をハッシュ テーブルに蓄積するという良い考えを持っていました。これにより、個別情報が作成済みかどうかを確認し、重複を防ぐことができます。情報が簡単に集められるのであれば、これは良い考えだと思います。そうでない場合は、tmpearce と Cristian のアイデアを組み合わせたわずかなバリエーションが機能する可能性があります。ここでは、関数が呼び出されたかどうかを追跡するセット (またはハッシュテーブルなど) を渡します。このようにして、何らかの関数が計算されたかどうかを確認できます。永続的な状態を必要としないため、複数回呼び出しても安全です。

いずれにせよ、この問題を解決済みとしてマークします。ただし、追加の回答を常に聞きたいと思っています。

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

c++ - 仮想継承を含むクラスを作成するプロセス

仮想基本クラス(通常は菱形継承問題を解決するために使用される)の使用法を説明する多くのチュートリアルでは、多くの場合、この構造の設計に類似したコードがあります。

Foxのインスタンスを作成すると、期待どおりの出力が得られます。作成された動物は1つだけです。

ご覧のとおり、2つのTier2クラスが仮想的に継承しています。現在、1つのティア2クラスのみが仮想的に継承され、もう1つはパブリックにのみ継承される場合、興味深い出力が発生する可能性があります。たとえば、FourLegsがパブリックに継承され、Mammalが仮想パブリックに継承される場合、これは次の出力になります。

これは奇妙で、疑問を投げかけます。継承ツリーのどこかに仮想継承を含むクラスを作成する完全なプロセスは何ですか?

一方、I FourLegsが仮想パブリックを継承し、Mammalがパブリックを継承している場合、出力は通常どおりです(仮想パブリックを継承していないかのように)。

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

c++ - ダイヤモンドの継承が機能するようになりましたが、Eclipse はまだ不平を言っています

見てくれてありがとう。

私はそれに慣れるために C++ のソフトウェア パターンを調べていますが、インターフェイス ベースのプログラミングの問題、つまりダイヤモンドの問題を抱えています。

状況は次のとおりです。それぞれ独自のインターフェイス クラスを持つクラスWidgetが派生するクラスがあります。クラスにはメソッドがあり、Buttonクラスにはのメソッドとメソッドがあります。WidgetfooButtonWidgetfoobar

したがって、問題は CButton が だけでなく も継承していたことですCWidget(fooこれIButtonは純粋な仮想です)。しかし、IButtonおよびで仮想継承を使用することによりCWidget、これはコンパイルおよび実行され、「foobar」が画面に出力されます。

ただし、問題は、Eclipse がCButton buttonエラーとしてフラグを立てていることです。

すべてが期待どおりに実行されるため、これは奇妙です。これは Eclipse の構文チェッカーの問題ですか? この問題には他の解決策があることを知っているので、Eclipse は私の方法が標準ではないことを伝えようとしているのかもしれません。

どんな助けでも大歓迎です。

編集: OSX Lion で gcc 4.2 を使用しており、c++ には最新バージョンの Eclipse を使用しています。

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

oop - ポリモーフィズム オブジェクトの作成 - ひし形の継承階層

言語 : C/C++
問題 : 一般的な例を挙げると、

  • Aは親クラスです。
  • BCはどちらもクラスAから継承されています。
  • DはBCの両方から継承されます

Dのオブジェクトを介してAの関数にアクセスしたい

注: これは仮想継承です。したがって、 A のオブジェクトは 1 つしかないことがわかります。

問題は、 BまたはCが最初に作成するオブジェクトはどれかということです。

ヒエラルキーを意識する

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

python - Pythonでの1対多の継承

私が最善の方法で何かをしているのかどうかについての質問...

Pythonで、(少なくとも)次のようなクラス階層を作成したいと思います。

しかし、私は、以下のように、およびサブクラスActorのそれぞれから、初期化したい特定の属性を持っているという事実にぶつかります。MoverAttacker

その後、これに対する最初のアプローチを採用し、スーパークラスのコンストラクターを使用するという点で常に持っているものに従うと、明らかにActorコンストラクターを2回呼び出すことになりますが、問題はありませんが、プログラマーはうずきを感じて「 dむしろそれをよりクリーンな方法で行います。

たとえば、コンストラクターを呼び出すことしかできず、単に'sを明示的に初期化することしかできませんでしたが、これは、の初期化コードを複製するため、はるかに悪いアプローチとして私に飛びつきます。MoverHuman_rangeAttacker

私が言ったように、_world属性を2回設定することは大したことではないことを私は知っていますが、もっと集中的なことが起こった場合Actor.__init__、この状況は心配になると想像できます。Pythonでこの構造を実装するためのより良い方法を誰かが提案できますか?

0 投票する
7 に答える
16400 参照

c# - インターフェースはダイヤモンドの問題をどのように解決しますか?

あなたと一つ話し合う必要があります。私は、クラスがインターフェイスのすべてのメソッドの実装を提供するクラスとインターフェイスの間の契約であるというインターフェイスについて読んでいます。有名なダイヤモンド問題を解決するために、インターフェイスがあります。いいね(私はC#を使用しています)

上記のコードにより、aClass はインターフェースの両方のメソッドの実装を提供したと言われています。私の混乱は次のとおりです。それがクラスとインターフェースの間の契約である場合、両方のインターフェースとの契約が満たされているとどのように言えますか?

現実世界の例として、私がジャックと 5 ドルを同時に与えるという契約を結んでいるように、ベンと 5 ドルを与えるという契約を結んでいます。 ) 両方との契約を履行したとどのように言えますか?

私の質問は幼稚に思えるかもしれませんが、それは私をとても混乱させます。

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

c++ - 仮想継承でイディオムを交換およびコピーするための適切なアプローチは何ですか?

古典的な仮想継承のダイアモンド階層を考えてみましょう。そのような階層でのコピーとスワップのイディオムの正しい実装は何であるかを知りたいと思います。

このは、A、B、Dクラスのデフォルトのコピーセマンティクスでうまく機能するため、少し人工的であり、あまりスマートではありません。ただし、問題を説明するためだけに、弱点の例を忘れて解決策を提供してください。

したがって、2つの基本クラス(B <1>、B <2>)から派生したクラスDがあります。各Bクラスは、実質的にAクラスから継承します。各クラスには、コピーとスワップのイディオムを使用した、自明ではないコピーセマンティクスがあります。最も派生したDクラスには、このイディオムの使用に問題があります。B<1>およびB<2>スワップメソッドを呼び出すと(仮想基本クラスメンバーを2回スワップします)、サブオブジェクトは変更されません!!!

A:

B

D:

S文字列を格納する単なるクラスです。

コピーを実行すると、A::sは変更されないままになります。

そして結果は次のとおりです。

おそらく追加B<N>::swapOnlyMeすると問題が解決します:

しかし、BがAから個人的に継承する場合はどうなりますか?

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

python - Python 多重継承: コンストラクターをひし形で 2 回呼び出すのを避ける

次のコードを検討してください。

私が理解している限り、アルゴリズムは次のとおりです。

実際には 3 つの
質問がありsuper().__init__()ます。2.この場合、 コールと2 回を回避するにはどうすればよいですか? 2.1 現在のクラスが継承するすべてのクラスを初期化する正しい方法は?B.__init__C.__init__selfD
C.__init__A.__init__