ホームページ  >  記事  >  Java  >  C で Java の `instanceof` 機能を実現する方法: `dynamic_cast` とその代替手段?

C で Java の `instanceof` 機能を実現する方法: `dynamic_cast` とその代替手段?

Barbara Streisand
Barbara Streisandオリジナル
2024-11-01 08:13:02568ブラウズ

How to Achieve Java's `instanceof` Functionality in C  : `dynamic_cast` and Alternatives?

C Java の Instanceof と同等:dynamic_cast と代替アプローチ

Java の instanceof 演算子を使用すると、オブジェクトが特定のインスタンスであるかどうかを確認できます。クラスまたはそのサブクラス。 C では、dynamic_cast を使用して同様の機能を実現できます。

<code class="cpp">if (NewType* v = dynamic_cast<NewType*>(old)) {
  // Cast succeeded, old is a NewType object
  v->doSomething();
}</code>

この方法では、コンパイラで実行時型情報 (RTTI) が有効になっている必要があります。ただし、dynamic_cast にはパフォーマンスが犠牲になる可能性があります。

代替アプローチ:

  • 仮想関数: ベースで仮想関数を定義します。各サブクラスがその特定の動作を実装するクラス。これにより、実行時にオブジェクトの型を確認し、適切な関数を呼び出すことができます。
  • ビジター パターン: さまざまなサブクラスの特定の動作を含むビジター クラスを作成します。ビジターでオブジェクトにアクセスすると、オブジェクトのインターフェイスを変更せずに、サブクラスに固有のアクションを実行できます。
  • 列挙型チェック: クラスの可能な型を表す列挙型を追加します。 switch ステートメントまたは条件ステートメントを使用して型を確認します。
<code class="cpp">switch (old->getType()) {
  case BOX:
    // old is a Box object
    break;
  case SPECIAL_BOX:
    // old is a SpecialBox object
    break;
}</code>

このアプローチには RTTI は必要ありませんが、マルチレベルの継承には適していません。

注: 動的型チェックは設計上の問題を示す可能性があるため、その必要性を検討してください。多くの場合、仮想関数や列挙型アプローチなどの代替手段により、より優れた設計とパフォーマンスが提供される可能性があります。

以上がC で Java の `instanceof` 機能を実現する方法: `dynamic_cast` とその代替手段?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。