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;
我正在尝试用派生的 类 动物(狗、猫等)填充向量。当我取出向量的内容时,我想将它们向下转换回派生的 类.
完成 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;