問題タブ [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.

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

c++ - C++ での動的キャストのコストはどれくらいですか?

さまざまなバックエンド (sdl、gl、d3d など) で動作する GUI API では、ジェネリック型のイメージを動的にキャストしたいと考えています。

つまり、1 秒あたり約 20 * 60 fps の動的キャストを行うことになります。

動的キャストのコストはどれくらいですか? パフォーマンスに顕著な悪影響があることに気付くでしょうか? 許容レベルのパフォーマンスを維持できる代替手段はありますか?

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

c++ - What is the proper use case for dynamic_cast?

I have been told many times (and seen myself in practice) that the use of dynamic_cast often means bad design, because it can and should be replaced with virtual functions.

For example, consider the following code:

It can be easily seen that instead of writing dynamic casts we can just add a virtual function doStuff() to Base and re-implement it in Derived.

In that case, my question is, why do we have dynamic_cast in the language at all? Is there an example in which the use of dynamic_cast is justified?

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

c++ - C++: boost::dynamic_pointer_cast の使用中に「... はポリモーフィック型ではありません」

次のコードに対して次のエラーが表示されるのはなぜですか?

C++ コードは多かれ少なかれ次のとおりです。

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

c++ - 共有ライブラリでのテンプレート化されたクラスとdynamic_castの明示的なインスタンス化

今日、私は解決できないような問題に遭遇しました。Derived<T>テンプレート化されたクラス( 、そのベースはBase)とこのクラスのいくつかの明示的なインスタンス化を含む共有ライブラリをコンパイルしています。ライブラリユーザーにこのテンプレートクラスから拡張してもらいたいです。この問題はdynamic_cast、ユーザーのインスタンスをからBase*にしようとすると発生しますDerived<T>*

問題をこのMWEに絞り込みました。

共有ライブラリには、次のファイルが含まれています。

Base.h

Derived.h

Derived.cpp

Helper.h

Helper.cpp

また、ライブラリを使用する単純なコードは次のようになります。

test.cpp

問題は、共有ライブラリを作成してそれにリンクtest.cppすると、dynamic_cast失敗することです。出力例は次のとおりです。

ただし、ライブラリ全体と例を一緒にコンパイルすると、キャストは成功します。


私の質問は:なぜdynamic_cast失敗するのですか?

そして、例のようなクラス構造を維持し、共有ライブラリを引き続き使用したいという前提の下で、どのようにしてDerived<some type>*キャストを正常に取得できBase*ますか?

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

c++ - コンストラクター内の「this」のdynamic_cast

この質問はこれと非常によく似ています。複数の継承中にdynamic_castを「横向き」にできないのはなぜですか。、キャストが機能することを除いて-コンストラクターの内部ではありません。

ヘッダ:

ソース:

主要:

結果:

したがって、dynamic_castは多重継承に対して機能しますが(驚くことではありません!)、実行時にB :: B()内の'this'ポインターに対して呼び出された場合はどうでしょうか。オブジェクトはコンストラクターの本体内で完全に形成されたと思いました。つまり、すべてのメモリがコンポーネントオブジェクトに割り当てられましたが、まだ初期化されていません。これはスーパークラスのコンストラクターの順序に依存することを理解していますが、この例では、AはBの前に呼び出されます。

私は明らかに内部で何が起こっているのか正確には理解していません、誰かが私を教えてくれますか?

ありがとう、カムバンバー。

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

c++ - 2つのdynamic_castの質問

  1. 頻繁に実行されるメソッドで動的キャストを使用しますか?オーバーヘッドが大きいですか?

  2. dynamic_castによって返されるポインタは正確には何ですか。同じアドレスへのポインタ?別のインスタンスへのポインタ?私はこの理解が不足しています。より具体的には-実行時に息子タイプへのポインターであることが判明した場合にのみ、父タイプのポインターに割り当てたい割り当てがあります。ソリューション?

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

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

c++ - dynamic_cast は、オーバーロードされた演算子削除内で機能しますか?

私はこれに出くわしました:

もしそうなら、

驚いたことに、Base::delete 内の条件が満たされ ていません。またはキャストからvoid*の情報を失いDerived*ますか?

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

casting - 非ポリモーフィック型である可能性のある Template クラスのキャスト変換 (dynamic_cast として) をチェックします

クラスにテンプレート メンバーがあり、このメンバーのクラスが特定のクラスから継承されているかどうかを知りたいです。

のクラスがポリモーフィックでない場合、dynamic_cast がコンパイルされないことはわかっていますがmy_member、テンプレート クラスを制御することはできません。 )。
T がポリモーフィックであるかどうかにかかわらず、コンパイルできるようにこれを実装するというアイデアはありませんか? アイデアをありがとう

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

c++ - 同じタイプへのdynamic_castは、オブジェクトのタイプをチェックしません

T *ポインタが指すオブジェクトが本当にTオブジェクトなのか、それとも他の無関係なタイプなのかを判断しようとしています。dynamic_castを試しましたが、役に立たないわけではありません。有効なTオブジェクトを指していないことが明らかな場合でも、nullではなくポインタ自体を返します。

これ、または他の解決策の回避策はありますか?dynamic_castが役に立たない前にvoid*とchar*にキャストしようとしましたが、サブクラスも受け入れたいので、typeidも十分ではありません。

いくつかのコンテキスト:とのような異なる種類の配列間の浅い変換を実装するカスタム配列クラスを作成しています。たとえば、すべての要素アクセスで動的型チェックを実行することにより、最小限の型の安全性を保証したいと思いますArray<Object*>Array<String*>

Object *にキャストしてから、Object *の型チェックを行うことは多くの場合に機能しますが、の場合は失敗します。ただし、を使用せずにArray<Object*>Object以外のものをに挿入できるかどうかはわかりません。Array<Object*>reinterpret_cast。

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

c++ - C++でのdynamic_castの実際の例

dynamic_castが必要で、まったく回避できない場合の実際の例を誰かに教えてもらえますか?私が考えることができる例は、一般的にダブルディスパッチで回避することができます。

制約が強すぎる場合は、dynamic_castが一般的に進むべき方法である例も良いでしょう。

「通常、タイプツリーの上下のタイプ間でキャストするために使用される」のではなく、実際の例を見たいと思います。