ホームページ > バックエンド開発 > C++ > C の派生クラスへのベースのキャストが失敗することが多いのはなぜですか? より良い代替手段は何ですか?

C の派生クラスへのベースのキャストが失敗することが多いのはなぜですか? より良い代替手段は何ですか?

Linda Hamilton
リリース: 2024-11-29 09:27:11
オリジナル
740 人が閲覧しました

Why Does Casting Base to Derived Classes in C   Often Fail, and What are the Better Alternatives?

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

質問は、基本型オブジェクトを派生型にキャストできないことを中心に展開しています。提供されているアプローチでは、有効なコンストラクターが欠落しているか、コンストラクターの解決があいまいであるため、エラーが発生します。

ここでは、継承の概念を理解することが重要です。動物の階層について考えてみましょう。

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

すべての動物は本質的に基本タイプのカテゴリに属する​​ため、基本タイプのオブジェクト (Animal など) を派生タイプの変数 (Dog など) に代入することはキャストなしで機能します。ただし、動的キャストを使用せずに派生型オブジェクトを基本型オブジェクト (例: Dog から Animal) にキャストしようとすると、スライスが発生し、派生型固有のデータが失われます。

動的キャストは、安全にキャストする方法を提供します。派生型オブジェクトを、オブジェクトがポリモーフィカルに格納される基本型コンテナに戻す:

std::vector<Animal*> barnYard;
barnYard.push_back(&dog);
barnYard.push_back(&cat);
barnYard.push_back(&duck);
barnYard.push_back(&chicken);

Dog* dog = dynamic_cast<Dog*>(barnYard[1]); // Note: NULL as this was the cat.
ログイン後にコピー

ただし、動的キャストの使用は、設計上の欠陥を示唆することがよくあります。代わりに、仮想メソッドを使用してプロパティに動的にアクセスすることを検討してください:

void makeNoise(Animal& animal) { animal.DoNoiseMake(); }
Dog dog;
Cat cat;
Duck duck;
Chicken chicken;

makeNoise(dog);
makeNoise(cat);
makeNoise(duck);
makeNoise(chicken);
ログイン後にコピー

以上がC の派生クラスへのベースのキャストが失敗することが多いのはなぜですか? より良い代替手段は何ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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