1. ホーム
  2. java

[解決済み】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
}