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 サイトの他の関連記事を参照してください。