This question already has answers here:
What is object slicing?
(18个回答)
Why do we need virtual functions in C++?
(26个答案)
去年关闭。
在使用c++和多态性时遇到麻烦。我意识到这是一个非常简单的问题,但是我真的在为从Java到c++的迁移而苦苦挣扎,尤其是在指针方面。
我有一个“玩具”类,并且从中继承了“娃娃”和“汽车”类。在每个类中,我都有一个名为printToy()的函数;我有一个可容纳娃娃,玩具和汽车对象的 vector 。我想遍历在每个索引处调用“printToy()”的 vector ,但是当我这样做时,它调用了Toy类的方法,从而为我提供了“Toy Toy Toy”而不是“Toy Doll Car”的输出。感谢任何可以帮助我的人!
这是示例:
(18个回答)
Why do we need virtual functions in C++?
(26个答案)
去年关闭。
在使用c++和多态性时遇到麻烦。我意识到这是一个非常简单的问题,但是我真的在为从Java到c++的迁移而苦苦挣扎,尤其是在指针方面。
我有一个“玩具”类,并且从中继承了“娃娃”和“汽车”类。在每个类中,我都有一个名为printToy()的函数;我有一个可容纳娃娃,玩具和汽车对象的 vector 。我想遍历在每个索引处调用“printToy()”的 vector ,但是当我这样做时,它调用了Toy类的方法,从而为我提供了“Toy Toy Toy”而不是“Toy Doll Car”的输出。感谢任何可以帮助我的人!
这是示例:
class Toy{
public:
void printToy(){
std::cout<<"Toy"<<std::endl;
}
};
class Doll: public Toy{
public:
void printToy(){
std::cout << "Doll" << std::endl;
}
};
class Car: public Toy{
public:
void printToy(){
std::cout << "Car" << std::endl;
}
};
int main(){
std::vector<Toy> toys;
Toy toy;
Doll doll;
Car car;
toys.push_back(toy);
toys.push_back(doll);
toys.push_back(car);
for(int i = 0; i < toys.size(); i++){
toys[i].printToy();
}
return 0;
}
最佳答案
首先,您的printToy
函数应为virtual
。否则,将不涉及多态性。 (感谢发表评论!)
vector 存储Toy
,仅存储Toy
。不涉及多态性。为了使用运行时多态性,您必须存储指针或类似内容(unique_ptr
,reference_wrapper
a等)而不是普通对象。像这样:
std::vector<Toy*> toys;
toys.emplace_back(&car);
toys.emplace_back(&doll);
for (auto& toy : toys)
toy->printToy();
关于c++ - 如何在子类的 vector 上应用多态函数,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55863357/
10-10 05:11