2016-05-31 9 views
0

私は、派生クラスの動物(犬、猫など)でベクターを埋めようとしています。ベクトルの内容を取り出すとき、私はそれらを派生クラスにダウンキャストする必要があります。C++ polymorphism:アップキャスト/リバースキャスティングと基底クラスのコンテナ、欠落データ

dog.setLegs(4)を実行した後、getLegs()で正しい数の脚を取り戻しています。しかし、動物のベクトルからAnimalオブジェクトを取り戻し、それをDog型にキャストした後、mydog-> getLegs()は私が予想したように4ではなくmeを返します。

私はここで何か間違っていると思いますが、私は何がわかりません。誰も私にこれを助けることができますか?ありがとう!!

class Animal{ 
}; 

class Dog : public Animal { 
public: 
    void setLegs(int newLegs){legs = newLegs;}; 
    int getLegs(){return legs;}; 
protected: 
    int legs=0; 
}; 


int main(int argc, char* argv[]){ 

    Dog dog; 
    dog.setLegs(4); 
    std::cout<<dog.getLegs()<<std::endl; 

    std::vector<Animal> animals; 
    animals.push_back(dog); 

    Dog *mydog = (Dog*) &(animals[0]); 
    std::cout<<mydog->getLegs()<<std::endl; 

    return 0; 
} 
+0

なぜ、あなたのベースクラスの抽象的ではないのですか? –

答えて

1

あなたstd::vectorAnimal秒が含まれています。 Animalのサブクラスをサブクラスの "スライス"に入れ、ベクトルにはAnimalのままにします。サブクラスはなくなりました。これ以上はありません。あなたが何をしたいか

ではなくAnimal年代に店のポインタです:

std::vector<Animal *> animals; 

だからあなたのコードの関連チャンクは次のようになります。

Dog *mydog = (Dog*)animals[0]; 
std::cout<<mydog->getLegs()<<std::endl; 
+0

これは私のために今働きます。ありがとう! – mathmonkey

関連する問題