c ++多态:upcasting / re-downcasting和基类容器,缺少数据

时间:2016-05-31 00:48:51

标签: c++ polymorphism downcast

我试图用衍生的动物类(狗,猫等)填充载体。当我取出向量的内容时,我想将它们向下转发回派生类。

在做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;
}

1 个答案:

答案 0 :(得分:1)

您的std::vector仅包含Animal个。将Animal的子类放入子类中的向量“切片”中,只留下向量中的Animal。子类消失了。它不复存在了。

您要做的是存储指向Animal的指针:

 std::vector<Animal *> animals;

所以代码的相关部分变为:

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