問題タブ [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 に答える
18020 参照

c++ - C++ 多重継承のあいまいな呼び出しの修正

次のような構造の 3 つのクラスがあります。

私は以下を取得しています:

In function ‘int main()’:
error: request for member ‘GetValue’ is ambiguous
error: candidates are: virtual float Keyword::GetValue()
error: virtual float MeasurementKeyword::GetValue()
error: virtual float CharacterKeyword::GetValue()

私は多重継承についていくつか読んだことがありますが、それには多くの落とし穴があることを知っています - これはそのうちの1つです。クラス構造をこのようにする必要があるので、テンプレートを使用してこれを修正できる方法があるかどうか疑問に思っていましたか?

更新
あなたのコメントを読んだ後、私の最初の考えAddressTypeCharacterKeyword、. そして、更新されたコードでそれをそのまま使用します。または、必要なメンバーの名前空間を指定することもできます。テンプレート化された方法はまだ答えとして言及されていないので、それは悪い修正ですか? 必要なメンバーの名前空間を指定するだけでよいですか?AddressTypeMeasurementKeywordAddressType

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

c++ - C++ ダイヤモンドのような継承

構築中に固定される方向とサイズの 2 つのプロパティを持つクラス Channel があります。方向は、前方 (1) または後方 (-1) の 2 つの値のいずれかを取ることができます。サイズは任意の値を取ることができますが、0 とゼロ以外の値の間には物理的に意味のある違いがあります。

方向やサイズの既知の値を持つ Channel オブジェクトを受け入れる関数を記述できるようにしたいと考えており、派生クラスを使用してこれを実装することを考えました。

明らかに、すべての順列を描いたわけではありません。

そのまま実装してみた

ForwardChannel と ZeroChannel のインスタンス化は正常に機能します。ForwardZeroChannel をインスタンス化すると、値を設定しない Channel のデフォルト コンストラクターのみが呼び出されます。Channel(1, 0) を初期化リストに追加する必要があります。

しかし、それは ForwardChannel と ZeroChannel から派生する目的の一部を無効にしているようです。これを行うより良い方法はありますか?

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

c++ - C++ の多重継承、ひし形のように見えますが、そうではありません

C++ における多重継承の問題:

ダイヤモンドの問題のように見えますが、そうではありません。仮想継承を追加しても解決できません。

私は正しいですか?

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

c++ - C++ のダイヤモンド継承コードが期待どおりに機能しない

C++ でのダイヤモンドの問題 (多重継承) の解決策を理解しようとしています。

ソリューションをよりよく理解するためにこのコードを作成しましたが、期待どおりに動作しません。

Visual Studio 2008 Express Edition が叫​​ぶ: エラー C2385: 'Print' 1> のあいまいなアクセスは、ベース 'B' の 'Print' 1> またはベース 'C' の 'Print' である可能性があります エラー C3861: 'Print' : 識別子が見つかりません

ここで何が欠けているのか教えてください。

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

c++ - C++ 仮想ダイヤモンド継承

次のように、ベースが V である B1 と B2 の両方から D が継承するダイヤモンド継承を取得したとします。

D* パラメータを初期化するとき、B1 および B2 のデフォルト コンストラクタが V コンストラクタを呼び出すことを期待しています。しかし、次の行を実行すると、V が 1 回呼び出されました。なんで?

前もって感謝します。

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

java - すべての Java メソッドがデフォルトで仮想化されているにもかかわらず、Java が多重継承をサポートしていないのはなぜですか?

すべてのJavaメソッドはデフォルトで仮想ですが、Javaが多重継承をサポートしていないのはなぜですか? Javaでダイヤモンドの問題が発生するのはなぜですか?

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

c++ - GCC がエラーを表示するのはなぜですか?

以下のコードでは、次の警告とエラーが表示されます。

しかし、A から B の仮想継承を削除すると (つまりstruct B : public A)、警告のみが表示され、エラーは発生しません。

なんで?これは恐ろしいダイヤモンドですか?

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

c++ - boost::bind によるダイヤモンドの継承

私はこのようなデザインを持っています:

コンパイラは、最初の boost::bind 呼び出しについて不平を言います。C および D 内の関数の呼び出しには問題はありません。正確なエラーは次のとおりです。

boost/bind/mem_fn_template.hpp(384): エラー C2594: 'newline': [T=TConcrete] を使用した 'Concrete *' から 'A *' へのあいまいな変換

これの何が問題なのですか?

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

java - 多重継承の概念を明確にする: ダイヤモンド構造の問題が発生する可能性はありますか?

2 つのインターフェイス I1 と I2 があり、両方のインターフェイスが同じメソッドを持っているとします。

現在、クラスは I1 と I2 の両方を実装しています。

注:同じメソッドを持つ複数のインターフェイスを実装する場合、実装クラスには 1 つの実装しかないことを理解しています。

  1. コンパイラは、throws 句に基づいて、このメソッドが I1 または I2 からのものかどうかを推測しますか? メソッド署名の明確化は必要ですか? (署名には、渡された名前とパラメーターが含まれていることを知っています。)

  2. 両方のインターフェースを実装してから e1 のみをスローする場合、実装するクラスが実際には両方のインターフェースを実装していないため、コンパイラはこれを許可しますか? それはダイヤモンド構造の問題を引き起こしますか?

  3. throws 句 e1 と 2 回目の e2 で同じメソッドを実装する必要がありますか? これを試したとき、コンパイラはメソッドが重複していることを教えてくれました。

  4. 最初に I1 を実装すると、それが I1 のメソッドであることが示され、最初に I2 を記述すると、その I2 のメソッドであることが示されます。なぜそうなのか説明せよ。