c++ 多态性:upcasting/re-downcasting 和 base class 的容器,缺少数据

c++ polymorphism: upcasting/re-downcasting and containers of base class, missing data

我正在尝试用派生的 类 动物(狗、猫等)填充向量。当我取出向量的内容时,我想将它们向下转换回派生的 类.

完成 dog.setLegs(4) 后,我用 getLegs() 得到了正确的腿数。然而,在从动物向量中取回 Animal 对象并将其转换回 Dog 类型后,mydog->getLegs() returns me 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;
}

您的 std::vector 仅包含 Animal。将 Animal 的子类放入子类之外的向量 "slices" 中,只在向量中留下 Animal。子类消失了。没有了

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

 std::vector<Animal *> animals;

因此您的相关代码块变为:

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