c++多态性:基类的上转换/下转换和容器,缺少数据

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

本文关键字:转换 数据 多态性 基类 c++      更新时间:2023-10-16

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

在完成dog.setLegs(4)之后,我将使用getLegs()返回正确的腿数。然而,在从animals向量中获取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;
}

您的std::vector只包含Animals。将Animal的子类放入向量中会"切片"子类,只在向量中保留Animal。子类已不存在。已经没有了。

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

std::vector<Animal *> animals;

因此,代码的相关部分变成:

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