問題タブ [dynamic-cast]
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# - dynamic_castを使用する必要がありますコピーするために?
アップデート1:
ナンセンスコードを修正しました!コメントありがとうございます。最初のスニペットのハッシュを作成しました。
アップデート2:
dynamic_castの使用は回答によって不要であると指摘されているため、質問のタイトルも更新されました。
ここで達成しようとしているのは、強力な型を使用したディープコピーです。Class2をClass2の別のインスタンスにコピーできるようにしたい。ただし、ベースであるClass1のCopyTo関数も使用したいと思います。このアイデアは、私のC#の経験から生まれたもので、通常はリターンタイプをジェネリックにします(C#スニペットを参照)。
そして、これが私がC#でそうする方法です:
さて、C#スニペットと比較すると、C++スニペットは臭いを感じます。ポインタなしでこれを行うことは可能ですか、それともこの方法がベストプラクティスですか?
c++ - 参照とポインターで dynamic_cast を使用する場合の動作の違い
dynamic_cast の動作を確認していたところ、失敗すると、宛先が参照型の場合にのみ std::bad_cast 例外がスローされることがわかりました。宛先がポインター型の場合、キャストから例外はスローされません。これは私のサンプルコードです:
出力は「キャッチされた不正なキャスト」と「NULL ポインター」です。コードは VS2008 を使用してコンパイルされます。これは正しい動作ですか? はいの場合、なぜ違いがあるのですか?
c++ - 継承階層をトラバースするための静的キャストと動的キャスト
静的キャストを使用して継承階層をナビゲートする方が動的キャストを使用するよりも効率的であると述べているC++に関する1冊の本を見ました。
例:
ただし、動的キャストと静的キャスト(上記で実装)の両方で、このようなナビゲーションを機能させるにはRTTIを有効にする必要があります。動的キャストでは、クラス階層が多態的である必要があります(つまり、少なくとも1つの仮想関数を持つ基本クラス)。
静的キャストのこの効率の向上はどこから来るのですか?この本は、動的キャストがタイプセーフなダウンキャストを行うための好ましい方法であると述べています。
c++ - 誤ってダイヤモンドを作成することを防ぐために、仮想継承を使用してもよいですか?
これは実際のコードを簡略化したものであり、誰かが既に Foo を実装し、そこから派生していることに気付いていなかったときに犯した本当の間違いです。
編集:このコードを実行する必要がないように...
- そのまま実行すると、「失敗」(望ましくない、デバッグが難しい) が出力されます。
- 「oops」とマークされた行を削除すると、「Foo」(望ましい動作) が出力されます。
- 「おっと」を残して 2 つの継承を仮想化すると、コンパイルされません (ただし、少なくとも何を修正すればよいかはわかっています)。
- 「oops」を削除して仮想化すると、コンパイルされて「Foo」が出力されます (望ましい動作)。
仮想継承を使用すると、結果は良好またはコンパイラ エラーになります。仮想継承がなければ、結果は良好であるか、説明がつかず、デバッグが困難な実行時障害になります。
Foo が既に行っていたことを基本的に複製する Bar を実装すると、動的キャストが失敗し、実際のコードでは問題が発生しました。
最初は、コンパイル エラーがないことに驚きました。次に、仮想継承がないことに気付きました。これにより、GCC で「一意の最終オーバーライド機能がありません」というエラーが発生しました。この設計にはひし形が含まれていないはずなので、意図的に仮想継承を使用しないことにしました。
しかし、Base から派生するときに仮想継承を使用していれば、コードは (おっともなく) 正常に機能し、コンパイル時にダイアモンドについて警告され、実行時にバグを追跡する必要があったはずです。
質問は、仮想継承を使用して将来同様の間違いを犯さないようにすることは許容できると思いますか? ここで仮想継承を使用する正当な技術的理由 (私にはわかります) はありません。設計にひし形があってはならないからです。その設計上の制約を強制するためだけに存在します。
interface - COMオブジェクトをCOMインターフェイスにdynamic_castしても、参照カウントは増加しませんね。
COMインターフェイスIYおよびIZを実装するC++クラスXがあり、タイプXのオブジェクトのIYインターフェイスへのポインタyがある場合、次のようにします。
それはオブジェクトの参照カウントを上げませんね?それを説明するためにRelease()を実行する必要はありませんよね?
重要な場合は、ATL/COMを使用しています。
答えは「参照数を増やすことはなく、Release()をする必要もない」と推測していますが、確認したいと思います。
前もって感謝します。
c++ - LLVMは動的キャストを回避するためのルールの例外ですか?
LLVMには、RTTIに代わる独自の手巻きの代替手段があります。これは、組み込みのRTTIよりも速度が向上し、vtable(dyn_cast
)のないクラスへの動的キャストを可能にします。dynamic_cast<>
ただし、より多くのクラスで使用できる場合でも、使用されている方法とまったく同じように使用できます。
LLVMは評判の良いC++プロジェクトであるため、動的キャストが多すぎることは悪いデザインの兆候であり、コードの臭いとしても知られているという一般的な意見に直面しているようです。確かに、パフォーマンスの高いダイナミックキャストは、標準よりも設計での使用を改善するものではありませんdynamic_cast
。では、誰がここにいますか?動的キャストの大規模な使用がC++コードの優れた設計上の選択である場合はありますか?Googleは、LLVMトランクのソースコードでこの種の動的キャストが690回発生することを明らかにしています。
function - 基本クラスを受け入れる関数を呼び出すときに、dynamic_cast を使用する必要がありますか?
私はこのようないくつかのクラスを持っています:
現時点では、そのような関数を呼び出すときは常に動的キャストを使用しようとしています (上記の #1)。
ただし、コードがかなり見苦しくなりますので、実際に必要かどうかを知りたいです。
このように dynamic_cast を使用しますか? もしそうなら、主な理由は何ですか?
c++ - これは dynamic_cast の適切な使用ですか?
Generic、CFG、および Evaluator の 3 つのクラスがあります。
一般的なものは次のとおりです。
CFG は次のとおりです。
Evaluator は何もサブクラス化しません。
PluginLCD という名前の DLL を提供しています。これには Connect というメソッドがあります。
scons を使用して DLL をコンパイルする方法は次のとおりです。
さて、私のコードには 2 つのシナリオがあります。1 つはクラスLCDControl
内にあり、サブクラスCFG
です。もう 1 つのシナリオは、上記のGeneric
サブクラスEvaluator
とCFG
. Evaluator には LoadPlugins というメソッドがあり、その名前が示すように、this
メソッドを介して DLLに渡されますConnect
。最初のシナリオではGeneric *
、Connect のキャストは を返す必要がありますNULL
。ただし、2 番目のシナリオでは、私の知る限り、有効なポインターが返されるはずです。このようには起こっていないようです。私はこれについて間違っていますか?
c++ - C++での動的キャストとは正確には何ですか
誰もがC++での動的キャストの意味を正確に知ることができます。このダイナミックキャスティングはどこで正確に使用できますか?これはインタビューで私に尋ねられました、そして私はこの質問のために空白になりました:)。
c++ - C ++:整数をポインターにキャストする安全な方法
アドレスを含む整数型を実際のポインタ型に変換する必要があります。次のようにreinterpret_castを使用できます。
ただし、これは、問題のアドレスが実際にMyClassオブジェクトを保持しているかどうかを確認するための実行時チェックを実行しません。最初にvoid*に変換し(reinterpret_castを使用)、次に結果にdynamic_castを使用することに利点があるかどうかを知りたいです。このような:
2番目の方法を使用することに利点はありますか?