問題タブ [downcast]

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 に答える
5318 参照

c++ - 追加機能を備えた派生クラスへの共有ポインタのダウンキャスト-これは安全ですか?

次の概要を検討してください。

AdditionalFunctionalityここでは、機能(メソッド)を追加する派生クラスで基本クラスを拡張しています。

最初の質問、これは大丈夫ですか?これは問題ないという質問をたくさん読みました。基本クラスで追加機能を宣言する必要があります(基本クラスで純粋仮想メソッドにすることをお勧めします)。しかし、私はこれをしたくありません。実装方法を変えるだけでなく、基本クラスの機能を拡張したい。この目標を達成するためのより良い解決策はありますか?

さて、このコードでは、STLコンテナーを使用してこれらのポインターを格納します。これにより、オブジェクトをスライスせずに、Base型のオブジェクトとDerived型のオブジェクトの両方へのポインターを格納できます。

2番目の質問、これは理にかなっていますよね?実際、私は基本クラスオブジェクト自体ではなく、基本クラスオブジェクトへのポインタを使用してスライスを回避していますか?

特定のポインターが派生オブジェクトを指していることを「知っている」場合は、それを使用std::dynamic_pointer_castしてスマートポインターをキャストします。

3番目の質問、これは警告なしにコンパイルされて機能しますが、安全ですか?有効?共有ポインターの参照カウントの側面を壊し、期待する前にdeleteオブジェクトまたはオブジェクトに失敗しますか?delete

最後に、p1とp2に示すように、コピーコンストラクターを使用するか、割り当てを介してこのキャストを実行できます。これを行うための好ましい/正しい方法はありますか?

同様の質問:

  • shared_ptr<Base>をshared_ptr<Derived>にダウンキャストしますか?:これは非常に近いですが、derviedクラスは私のように機能を追加しないので、完全に同じかどうかはわかりません。また、boost::shared_ptr私が使用している場所を使用しますstd::shared_ptr(ただし、ブーストがstdライブラリに提供されたshared_ptrを理解しているため、同じである可能性があります)。

ご協力ありがとうございました。


編集:

私が尋ねる理由の1つは、次のことが(誤って)行われる可能性があることを認識していることです。

BaseオブジェクトへのポインターをDerivedオブジェクトのポインターにダウンキャストしてから、Derivedクラスにのみ実装されているメソッドを呼び出そうとします。言い換えると、ポイントされたオブジェクトは定義されていません(またはメソッドを「認識」していません)。

これはコンパイラーによって検出されませんが、定義方法によってはセグメンテーション違反が発生する可能AdditionalFunctionality性があります。

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

java - リスト オブジェクトの継承とキャスト

フルーツのリストをリストに含まれるフルーツのサブクラスにキャストするのに問題があります。

クラスオレンジのリストになるようにオレンジをキャストするにはどうすればよいですか? これは悪い設計パターンですか?基本的に、フルーツのリストであるサーバーから JSON 応答を取得しています。Web サービスへの特定の呼び出しごとに、取得する Fruit のサブクラスがわかっているので、その List を適切にキャストする必要があります。

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

delphi - SW-Design: Delphi のクラス階層のアダプター (ジェネリックとダウンキャスト)

次の問題についていくつかの提案をしたいと思います: VCL コントロール用のアダプターを書きたいとしましょう。すべてのアダプタは同じ基本クラスを持つ必要がありますが、特別なコントロールのラッピングが異なります (たとえば、TEdit から値を取得することは、TSpinEdit から値を取得することとは異なります)。したがって、最初のアイデアは、次のようなクラス階層を作成することです

次に、vcl コントロールへの参照を保持するフィールドを導入します。私の特別なアダプターでは、もちろん、具体的なサブクラスで動作します。ただし、基本クラスには参照も含まれている必要があります (たとえば、アダプターを使用してコントロールを表示する場合)。

可能性 1 (プロパティ アクセサーでのダウンキャスト):

したがって、特定のメソッドを実装する場合は Control プロパティを使用し、基本クラスで何かを行う場合は protected フィールドを使用します。

可能性 2 (ジェネリック基本クラスを使用):

どちらのソリューションをご希望ですか? それとも、さらに優れた 3 番目の解決策がありますか?

敬具、

キリスト教徒

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

c - ポインタのアップキャストとダウンキャスト

ポインターダウンキャスト

出力:

質問: サンプルが char サイズのデータ​​に分割されたのはなぜですか? また、ポインター演算が実行された場合、どのようにして残りの値を取得できたのでしょうか? これはどのように可能でしたか?


ポインターのアップキャスト

出力:

質問: *ptrUint にガベージ値があるのはなぜですか? ガベージ値が ptrUint に似ているのはなぜですか? このガベージ値を回避するには、malloc() または calloc() を使用する必要がありますか? ガベージ値を削除するには、どのような救済策を提案しますか?

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

scala - Scala: ダウンキャストで java.lang.ClassCastException がスローされる

Java 以外のバックグラウンドから Scala に移行したことで、この問題を含むさまざまな問題が発生しました。

実行時に ClassCastException がスローされることは理解していますが、これは実行時にaB のようには見えませんが、実際には (私が理解している限り) です。何が起きてる?回避策はありますか?ありがとう。

a編集:JVMはキャストできないことをどのように理解していBますか? a.getClassとの間の浅い比較を実行しますBか?

ps。ライブラリ クラスにプライベート変数を追加し、ライブラリで定義されたクラス (フィールドを追加しようとしているクラス) を引数として受け入れるクラス メソッドの 1 つをオーバーライドしようとしています。

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

java - オブジェクトから整数ランタイムエラーへのダウンキャスト:java.lang.ClassCastException

実行時例外java.lang.ClassCastingException--..。

ダウンキャストは安全ではないことは理解していますが、なぜこれが発生するのですか?に変換しようとしArrayListましStringIntegerint、同じエラーが発生します。

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

c++ - C ++ポリモーフィッククラス、仮想関数、パフォーマンスのためのキャスト

私は次のクラスを持っています:

すべてStateから継承する他のクラスがあります。それらの違いは、動作に依存するisTerm()の評価方法にのみあります。あらゆる種類の状態派生クラスで動作するように設計された他のテンプレートクラスがいくつかあるという事実がなければ、仮想関数burオーバーライド関数isTermを使用したくありません。それらの1つはポリシーです:

updateOptimalは、その状態のポリシーを検索するために、状態から派生したクラス(動作に応じて)を取得する必要があります。これは、状態*ptrから現在使用されているSタイプにアップキャストされます。さて、状態から派生したクラスはポリモーフィックであるため、私はそれが正しいことだと思いました。

ここで、iterはアクションのイテレーターであり、各アクションにはアクションのポインターがあります- State *nextstate; >nextstateは他のポイントに設定されます。

State *nextstate;使用と使用を避けるために、クラスAction全体をテンプレート化することもできますS *nextstate;が、プロジェクト全体で膨大な量の変更が必要になります。

cplusplus.comのキャストチュートリアルを読むと、アップキャストまたはダウンキャストの前に型チェックを行うため、dynamic_castを使用するのが最善であると理解しています。ただし、キャスト後の次のコードでは、検索に使用する以外は、アップキャストされた状態に対して何もしません。

findPolicyは次のとおりです。

  • 安全チェックをスキップして、静的キャストを使用しても大丈夫ですか?私はそれを試しました、そしてそれはコンパイルします。
  • チェックを完全にスキップして、reinterpret_castを実行しても大丈夫ですか?私も試してみましたが、コンパイルされます。
  • dynamic_castを実行した場合のペナルティは何ですか?小さなオーバーヘッドがあることは知っていますが、それは何か深刻なことですか?
  • ポリモーフィッククラスを使用せずに(仮想関数を回避して単純にオーバーライドする)状態*ptrからSタイプ*ptrにアップキャストする方法はありますか?
0 投票する
2 に答える
631 参照

c#-4.0 - 型パラメーター - 型 T から具象型を取得 : IMyInterface

私が持っているとしましょうList<IMyInterface>...

、、、を実装する 3 つのクラスがありますIMyInterfaceMyClass1MyClass2MyClass3

私は読み取り専用の辞書を持っています:

私は別のインターフェースを持っています、IFunnyInteface<T> where T : IMyInterface

私は方法を持っています:

FunnyClasses のコンストラクターを呼び出して、パラメーターとして MyClass オブジェクトを挿入しようとしています。それがどのオブジェクトかは知りたくありません。 MyClass をパラメーターとして使用して FunnyClass をインスタンス化したいだけです。

ConvertToFunnyClass を呼び出すとどうなるかT、タイプは IMyInterfaceであり、それを にキャストしようとすると、たとえば にFunnyInterface<T>変換できないと表示されますFunnyClass1FunnyInterface<IMyInterface>

私の現在の回避策(美しいものではありません)は次のとおりです。

そして、戻り値の型がdynamicであるため、私はそれが好きではありません。そのため、別の場所からアクセスすると、それがどの型であるかがわかりません。インテリセンスなどが失われます。パフォーマンスへの影響についてもわかりません。

手がかりはありますか?

前もって感謝します!

解像度

私は C# 4.0 を使用しているので、共分散 (出力位置のみ) を使用してエラーのキャストを停止できたのでIFunnyInterface

返信ありがとうございます。

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

c++ - std::shared_ptr をどのようにダウンキャストしますか?

検討:

std::shared_ptr<ChildOne>(static_cast<ChildOne*>(ptr.get()))(参照カウントが 2 つの 間で共有されないため、単に a を実行できないことに注意してくださいshared_ptr)

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

c++ - プライベートスコープ内のプライベート継承に関する動的なダウンキャスト

私が遭遇したこの質問の微調整。検討:

aPtr1は実際にはタイプであり、からのB*完全なアクセスBと継承がAあるため、両方のキャストが機能することを期待していました。しかし、そうではありません。なぜ?このキャストを達成する別の方法はありますか?

ご了承ください:

  • Bのメンバーでなければfoo()、両方のキャストが失敗します。
  • 公にB継承する場合は、両方のキャストが機能します。A