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

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

c++ - クロスキャストが機能する可能性があるかどうかを確認しますか?

dynamic_castクラス階層全体で「クロスキャスト」を行うために使用することは合法であることを私は知っています。たとえば、次のようなクラスがある場合:

A*タイプのオブジェクトを指すポインタがある場合はC、次を使用できます。

私が指しているBベースオブジェクトへのポインタを取得します。C

C私がこれに言及する理由は、私が上記のコードを書いている時点で、コンパイラーがの定義を見たとしても、それがまだ見られていない可能性があるためAですBAこれは、コンパイラがとの間の接続を検出しない可能性があることを意味しますが、クラスが存在し、ある状況下で成功するB可能性があるため、とにかくコードをコンパイルする必要があります。Cdynamic_cast

問題は、これは、間違ったタイプのオブジェクトに誤ってクロスキャストする可能性があることを意味します。次のようなクラスがあるとします。

ここに、Dいくつかのランダムな無関係のクラスがあります。私がこのようなものを書こうとすると:

dynamic_castに接続する方法がないため、これは実行時に常に失敗します。を使用するつもりだったために誤って使用した場合、コンパイラは、意味のないキャストがあることをまったく示しません。ADDB

私の質問は、キャストが実行時に常に失敗することをコンパイラに警告させる方法はありますか? 言語レベルのソリューション、またはこれを検出できる主要なコンパイラーのコンパイラー設定に満足しています。外部ツールがある場合は、それでも問題ありません。このクラスのエラーをキャッチできるかどうかを知りたいだけです。

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

c++ - 仮想ベースからのダウンキャストとクロスキャストのどちらが速いですか?

私はパフォーマンスについてあまり心配していないので、これはやや仮説的なものです。実際にどのオプションが一般的に最速/最も効率的か、またはまったく違いがないかどうか疑問に思っています。

オーバーロードをサポートするビジター テンプレートの次のコードがあるとします。

次に、これを使用して一般的な訪問者を作成します。

訪問者を使用すると、最終的にクロスキャストであるdynamic_cast<>from Visitortoになります。VTarget<T>

これを実装できるもう 1 つの方法は、仮想ベースを作成することですVisitor。これにより、Visitor から直接継承する必要がなくなります。Visitor::visit コードのは、仮想ベースからのダウンキャストになります。VTarget<T>MyVisitordynamic_cast<>Visitor

キャストを実行するとき、あるメソッドは他のメソッドよりも高速ですか? それとも、仮想ベースを持つことでサイズのペナルティを受けるだけですか?

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

c++ - C++ での複雑な dynamic_cast

私はC++で次のケースを持っています:

  • 抽象基本クラスAbstract1Abstract2. それらは無関係です。
  • とのFoo両方から派生するクラスAbstract1Abstract2

私は、クラスに関する情報がないFoo(宣言も定義もない) コンパイル ユニットにいます。Abstract1とのみAbstract2が知られています。(実際、Foo は DLL でも定義されています)

dynamic_cast は からAbstract1*へのキャストを許可しAbstract2*ますか? これは標準ですか?