[解決済み】javaのinstanceofに相当するC++の機能
2022-02-19 12:32:52
質問
C++でjavaと同等の機能を実現するには、どのような方法が望ましいですか?
instanceof
?
解決方法は?
を使ってみてください。
if(NewType* v = dynamic_cast<NewType*>(old)) {
// old was safely casted to NewType
v->doSomething();
}
このためには、コンパイラでrttiのサポートが有効になっている必要があります。
編集部 この回答には、良いコメントがありましたよ。
dynamic_cast(またはinstanceof)を使う必要があるたびに、それが必要なことなのかどうか自問自答した方がいい。一般に、これは設計が不十分であることの表れです。
典型的な回避策は、チェックするクラスの特別な振る舞いを基底クラスの仮想関数に入れるか、あるいは 訪問者 ここで、インターフェイスを変更することなく、サブクラスのための特定の動作を導入することができます(もちろん、訪問者受け入れインターフェイスを追加することは除きます)。
ご指摘の通り、dynamic_castはタダではありません。シンプルで一貫した性能を持つハックは、基本的に、クラスが持ちうるすべての型を表す列挙型を追加し、正しい型を得たかどうかをチェックすることです(すべての場合ではありません)。
if(old->getType() == BOX) {
Box* box = static_cast<Box*>(old);
// Do something box specific
}
これは良い設計ではありませんが、回避策になり得ますし、そのコストは多かれ少なかれ仮想関数呼び出しだけです。また、RTTIが有効であるかどうかに関係なく動作します。
この方法は複数レベルの継承をサポートしていないので、注意しないと以下のようなコードになる可能性があることに注意してください。
// Here we have a SpecialBox class that inherits Box, since it has its own type
// we must check for both BOX or SPECIAL_BOX
if(old->getType() == BOX || old->getType() == SPECIAL_BOX) {
Box* box = static_cast<Box*>(old);
// Do something box specific
}
関連
-
[解決済み] java のクラス内のコンストラクタは、指定された型に適用できない
-
[解決済み】デフォルトのキーストアファイルが存在しない?
-
[解決済み] staticmethodとclassmethodの違いについて
-
[解決済み] JavaにおけるHashMapとHashtableの違いは何ですか?
-
[解決済み] なぜパスワードにはStringではなくchar[]が好まれるのですか?
-
[解決済み] C++でintをstringに変換する最も簡単な方法
-
[解決済み] Javaの「for each」ループはどのように機能するのですか?
-
[解決済み] Java のコア・ライブラリにおける GoF デザイン・パターンの例
-
[解決済み】Android UserManager.isUserAGoat()の正しい使用例?)
-
[解決済み】なぜJavaの+=, -=, *=, /=複合代入演算子はキャスティングを必要としないのですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】HTTPステータス 405 - リクエストメソッド「POST」はサポートされていません (Spring MVC)
-
[解決済み】Android Studio クラス org.codehaus.groovy.runtime.InvokerHelper を初期化できませんでした。
-
[解決済み】"実引数リストと形式引数リストの長さが異なる"
-
[解決済み] hibernateでResultSetを抽出できない。
-
[解決済み】代入の左手は必ず変数 CharAt
-
[解決済み】StringUtils.isBlank() vs String.isEmpty()
-
[解決済み】宣言されたパッケージが期待されるパッケージと一致しない ""
-
[解決済み】非閉鎖文字リテラルエラー
-
[解決済み】デフォルトのキーストアファイルが存在しない?
-
[解決済み】java 'jar'が内部コマンドまたは外部コマンドとして認識されない。