ホームページ >バックエンド開発 >C++ >C の `static_cast` と `dynamic_cast` の違いは何ですか?

C の `static_cast` と `dynamic_cast` の違いは何ですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-04 01:42:11325ブラウズ

What's the Difference Between `static_cast` and `dynamic_cast` in C  ?

C の動的キャストと静的キャスト

C の Dynamic_cast と static_cast の概念は、特に多態性クラスを扱う場合に混乱を招く可能性があります。これらの概念をよりよく理解するために、C での同等の概念を高レベルの観点から考えてみましょう。

static_cast<>

static_cast<> C での操作は安全なコンパイル時のキャストです。これにより、宛先とソースのタイプが確実に関連し、データの破損が防止されます。型が関連していない場合、コンパイル エラーが発生します。

以下の例では、static_cast<>この操作は、基本クラスへのポインタを派生クラスへのポインタに安全にキャストします。

class B {};
class D : public B {};
D* d = new D;
B* b = static_cast<B*>(d); // Safe compile-time cast

dynamic_cast<>

static_cast<> とは異なり、dynamic_cast< >はランタイムキャストです。ポインターの実際の型がターゲットの型と一致するかどうかを実行時にチェックします。基本クラスから派生クラス (B2D) と派生クラスから基本クラス (D2B) へのキャストの両方を処理できます。

D2B キャストの場合、dynamic_cast<>キャストが無効な場合は、単純に NULL ポインタを返します。ただし、B2D キャストの場合、クラス階層はポリモーフィズムをサポートする必要があります。つまり、基本クラスで少なくとも 1 つの仮想関数を定義する必要があります。

次の例では、dynamic_cast<>基底クラスへのポインタを派生クラスへのポインタに安全にキャストするために使用されます。

class Base { virtual void DoIt() = 0; };
class Foo : public Base {};
class Bar : public Base {};
Base* base = new Foo;
Foo* foo = dynamic_cast<Foo*>(base); // Safe run-time cast

base が実際に Bar オブジェクトを指している場合、dynamic_cast<>操作では NULL が返されます。これにより型の安全性が確保され、未定義の動作が防止されます。

以上がC の `static_cast` と `dynamic_cast` の違いは何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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