問題タブ [cross-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
クラス階層全体で「クロスキャスト」を行うために使用することは合法であることを私は知っています。たとえば、次のようなクラスがある場合:
A*
タイプのオブジェクトを指すポインタがある場合はC
、次を使用できます。
私が指しているB
ベースオブジェクトへのポインタを取得します。C
C
私がこれに言及する理由は、私が上記のコードを書いている時点で、コンパイラーがの定義を見たとしても、それがまだ見られていない可能性があるためA
ですB
。A
これは、コンパイラがとの間の接続を検出しない可能性があることを意味しますが、クラスが存在し、ある状況下で成功するB
可能性があるため、とにかくコードをコンパイルする必要があります。C
dynamic_cast
問題は、これは、間違ったタイプのオブジェクトに誤ってクロスキャストする可能性があることを意味します。次のようなクラスがあるとします。
ここに、D
いくつかのランダムな無関係のクラスがあります。私がこのようなものを書こうとすると:
とdynamic_cast
に接続する方法がないため、これは実行時に常に失敗します。を使用するつもりだったために誤って使用した場合、コンパイラは、意味のないキャストがあることをまったく示しません。A
D
D
B
私の質問は、キャストが実行時に常に失敗することをコンパイラに警告させる方法はありますか? 言語レベルのソリューション、またはこれを検出できる主要なコンパイラーのコンパイラー設定に満足しています。外部ツールがある場合は、それでも問題ありません。このクラスのエラーをキャッチできるかどうかを知りたいだけです。
c++ - 仮想ベースからのダウンキャストとクロスキャストのどちらが速いですか?
私はパフォーマンスについてあまり心配していないので、これはやや仮説的なものです。実際にどのオプションが一般的に最速/最も効率的か、またはまったく違いがないかどうか疑問に思っています。
オーバーロードをサポートするビジター テンプレートの次のコードがあるとします。
次に、これを使用して一般的な訪問者を作成します。
訪問者を使用すると、最終的にクロスキャストであるdynamic_cast<>
from Visitor
toになります。VTarget<T>
これを実装できるもう 1 つの方法は、仮想ベースを作成することですVisitor
。これにより、Visitor から直接継承する必要がなくなります。Visitor::visit コードのは、仮想ベースからのダウンキャストになります。VTarget<T>
MyVisitor
dynamic_cast<>
Visitor
キャストを実行するとき、あるメソッドは他のメソッドよりも高速ですか? それとも、仮想ベースを持つことでサイズのペナルティを受けるだけですか?
c++ - C++ での複雑な dynamic_cast
私はC++で次のケースを持っています:
- 抽象基本クラス
Abstract1
とAbstract2
. それらは無関係です。 - との
Foo
両方から派生するクラスAbstract1
Abstract2
私は、クラスに関する情報がないFoo
(宣言も定義もない) コンパイル ユニットにいます。Abstract1
とのみAbstract2
が知られています。(実際、Foo は DLL でも定義されています)
dynamic_cast は からAbstract1*
へのキャストを許可しAbstract2*
ますか? これは標準ですか?