問題タブ [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.
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
性があります。
java - リスト オブジェクトの継承とキャスト
フルーツのリストをリストに含まれるフルーツのサブクラスにキャストするのに問題があります。
クラスオレンジのリストになるようにオレンジをキャストするにはどうすればよいですか? これは悪い設計パターンですか?基本的に、フルーツのリストであるサーバーから JSON 応答を取得しています。Web サービスへの特定の呼び出しごとに、取得する Fruit のサブクラスがわかっているので、その List を適切にキャストする必要があります。
delphi - SW-Design: Delphi のクラス階層のアダプター (ジェネリックとダウンキャスト)
次の問題についていくつかの提案をしたいと思います: VCL コントロール用のアダプターを書きたいとしましょう。すべてのアダプタは同じ基本クラスを持つ必要がありますが、特別なコントロールのラッピングが異なります (たとえば、TEdit から値を取得することは、TSpinEdit から値を取得することとは異なります)。したがって、最初のアイデアは、次のようなクラス階層を作成することです
次に、vcl コントロールへの参照を保持するフィールドを導入します。私の特別なアダプターでは、もちろん、具体的なサブクラスで動作します。ただし、基本クラスには参照も含まれている必要があります (たとえば、アダプターを使用してコントロールを表示する場合)。
可能性 1 (プロパティ アクセサーでのダウンキャスト):
したがって、特定のメソッドを実装する場合は Control プロパティを使用し、基本クラスで何かを行う場合は protected フィールドを使用します。
可能性 2 (ジェネリック基本クラスを使用):
どちらのソリューションをご希望ですか? それとも、さらに優れた 3 番目の解決策がありますか?
敬具、
キリスト教徒
c - ポインタのアップキャストとダウンキャスト
ポインターダウンキャスト
出力:
質問: サンプルが char サイズのデータに分割されたのはなぜですか? また、ポインター演算が実行された場合、どのようにして残りの値を取得できたのでしょうか? これはどのように可能でしたか?
ポインターのアップキャスト
出力:
質問: *ptrUint にガベージ値があるのはなぜですか? ガベージ値が ptrUint に似ているのはなぜですか? このガベージ値を回避するには、malloc() または calloc() を使用する必要がありますか? ガベージ値を削除するには、どのような救済策を提案しますか?
scala - Scala: ダウンキャストで java.lang.ClassCastException がスローされる
Java 以外のバックグラウンドから Scala に移行したことで、この問題を含むさまざまな問題が発生しました。
実行時に ClassCastException がスローされることは理解していますが、これは実行時にa
B のようには見えませんが、実際には (私が理解している限り) です。何が起きてる?回避策はありますか?ありがとう。
a
編集:JVMはキャストできないことをどのように理解していB
ますか? a.getClass
との間の浅い比較を実行しますB
か?
ps。ライブラリ クラスにプライベート変数を追加し、ライブラリで定義されたクラス (フィールドを追加しようとしているクラス) を引数として受け入れるクラス メソッドの 1 つをオーバーライドしようとしています。
java - オブジェクトから整数ランタイムエラーへのダウンキャスト:java.lang.ClassCastException
実行時例外java.lang.ClassCastingException
--..。
ダウンキャストは安全ではないことは理解していますが、なぜこれが発生するのですか?に変換しようとしArrayList
ましString
たInteger
がint
、同じエラーが発生します。
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にアップキャストする方法はありますか?
c#-4.0 - 型パラメーター - 型 T から具象型を取得 : IMyInterface
私が持っているとしましょうList<IMyInterface>
...
、、、を実装する 3 つのクラスがありますIMyInterface
。MyClass1
MyClass2
MyClass3
私は読み取り専用の辞書を持っています:
私は別のインターフェースを持っています、IFunnyInteface<T> where T : IMyInterface
私は方法を持っています:
FunnyClasses のコンストラクターを呼び出して、パラメーターとして MyClass オブジェクトを挿入しようとしています。それがどのオブジェクトかは知りたくありません。 MyClass をパラメーターとして使用して FunnyClass をインスタンス化したいだけです。
ConvertToFunnyClass を呼び出すとどうなるかT
、タイプは IMyInterface
であり、それを にキャストしようとすると、たとえば にFunnyInterface<T>
変換できないと表示されますFunnyClass1
FunnyInterface<IMyInterface>
私の現在の回避策(美しいものではありません)は次のとおりです。
そして、戻り値の型がdynamic
であるため、私はそれが好きではありません。そのため、別の場所からアクセスすると、それがどの型であるかがわかりません。インテリセンスなどが失われます。パフォーマンスへの影響についてもわかりません。
手がかりはありますか?
前もって感謝します!
解像度
私は C# 4.0 を使用しているので、共分散 (出力位置のみ) を使用してエラーのキャストを停止できたのでIFunnyInterface
、
返信ありがとうございます。
c++ - std::shared_ptr をどのようにダウンキャストしますか?
検討:
std::shared_ptr<ChildOne>(static_cast<ChildOne*>(ptr.get()))
(参照カウントが 2 つの 間で共有されないため、単に a を実行できないことに注意してくださいshared_ptr
)
c++ - プライベートスコープ内のプライベート継承に関する動的なダウンキャスト
私が遭遇したこの質問の微調整。検討:
aPtr1
は実際にはタイプであり、からのB*
完全なアクセスB
と継承がA
あるため、両方のキャストが機能することを期待していました。しかし、そうではありません。なぜ?このキャストを達成する別の方法はありますか?
ご了承ください:
- Bのメンバーでなければ
foo()
、両方のキャストが失敗します。 - 公に
B
継承する場合は、両方のキャストが機能します。A