我试图用衍生的动物类(狗,猫等)填充载体。当我取出向量的内容时,我想将它们向下转发回派生类。
在做dog.setLegs(4)之后,我用getLegs()恢复了正确数量的腿。然而,在从动物矢量中取回Animal对象并将其转换回类型Dog之后,mydog-> getLegs()会返回0而不是4,正如我所期望的那样。
我认为我在这里做错了但我不确定是什么。任何人都可以帮我吗?谢谢!!
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::vector
仅包含Animal
个。将Animal
的子类放入子类中的向量“切片”中,只留下向量中的Animal
。子类消失了。它不复存在了。
您要做的是存储指向Animal
的指针:
std::vector<Animal *> animals;
所以代码的相关部分变为:
Dog *mydog = (Dog*)animals[0];
std::cout<<mydog->getLegs()<<std::endl;