ホームページ > バックエンド開発 > C++ > C で派生クラスへの動的キャストを安全に実行するにはどうすればよいですか?

C で派生クラスへの動的キャストを安全に実行するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-01 11:42:14
オリジナル
746 人が閲覧しました

How to Safely Perform Dynamic Casting to Derived Classes in C  ?

C での派生クラスへの動的キャスト

動的キャストは、オブジェクトを基底クラスから派生クラスに変換するために使用される手法です。ただし、オブジェクトが正しい型ではない場合、エラーが発生する可能性があります。

問題:

基本クラス オブジェクトを派生クラスにキャストしようとすると、次のような結果が得られます。エラー:「BaseType から DerivedType に変換できません。ソース型を取得できるコンストラクターがないか、コンストラクターのオーバーロード解決が失敗しました。」曖昧です。"

BaseType m_baseType;

DerivedType m_derivedType = m_baseType; // Error
DerivedType m_derivedType = (DerivedType)m_baseType; // Error
DerivedType * m_derivedType = (DerivedType*) &m_baseType; // Error
ログイン後にコピー

解決策:

これらのエラーを回避するには、オブジェクト指向の概念を理解することが重要です。次の動物の階層を考えてみましょう:

class Animal { /* Virtual members */ };
class Dog : public Animal {};
class Cat : public Animal {};
ログイン後にコピー

キャスト ルール:

  • アップキャスト (ベースから派生へ): として暗黙的に許可されています。派生オブジェクトもベースですobject.
  • ダウンキャスト (ベースに派生): Dynamic_cast が必要<>オペレーター。オブジェクトが正しいタイプでない場合は、NULL を返します。

例:

Dog     dog;
Cat     cat;
Animal& AnimalRef1 = dog;  // Upcasting OK
Animal& AnimalRef2 = cat;  // Upcasting OK
Animal* AnimalPtr1 = &dog; // Upcasting OK
Animal* AnimalPtr2 = &cat; // Upcasting OK

Cat&    catRef1 = dynamic_cast<Cat&>(AnimalRef1);  // Throws exception (not a cat)
Cat*    catPtr1 = dynamic_cast<Cat*>(AnimalPtr1);  // Returns NULL (not a cat)
Cat&    catRef2 = dynamic_cast<Cat&>(AnimalRef2);  // Succeeds
Cat*    catPtr2 = dynamic_cast<Cat*>(AnimalPtr2);  // Succeeds
ログイン後にコピー

重要な注意事項:

動的キャストは、特に継承階層を扱う場合には、慎重に使用する必要があります。代わりに、ポリモーフィズムとオブジェクト プロパティへのアクセスには仮想メソッドを優先してください。

以上がC で派生クラスへの動的キャストを安全に実行するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート