我的概念(不是真实的(类层次结构为:
struct Pet{};
struct Cat : Pet{};
struct Dog : Pet{};
对象为 :
Pet p("unknown");
Cat c("Kitty");
Dog D("Tommy");
现在,如何将对象p,c,d
存储在单个容器中,例如std::vector
.但是我想不出办法。当我std::vector<Pet>
其他班级被切下来时。我什至无法将它们存储为容器上的指针,因为指针仍然具有不同的类型。
通常,将它们放在同一个容器中的唯一原因是将它们用作基本类型,利用多态性根本不关心特定类型是什么。 这需要使用虚拟方法。 例如:
struct Pet {
virtual ~Pet();
virtual void speak(std::ostream &) const = 0;
};
Pet::~Pet() {}
struct Cat : public Pet {
virtual void speak(std::ostream &) const override;
};
void Cat::speak(std::ostream & o) const {
o << "Meow!n";
}
struct Dog : public Pet {
virtual void speak(std::ostream &) const override;
};
void Dog::speak(std::ostream & o) const {
o << "Woof!n";
}
现在我们有一个虚拟方法(speak(std::ostream&)
(,我们可以通过指针调用Pet
,而不需要知道宠物的实际类型:
std::vector<std::unique_ptr<Pet>> pets;
pets.emplace_back(std::make_unique<Cat>());
pets.emplace_back(std::make_unique<Dog>());
for (auto const & pet : pets) {
pet->speak(std::cout);
}
显示:
Meow!
Woof!
如果不能像这样将容器中的所有对象视为基本实例,那么几乎没有理由将它们放在同一个容器中 - 有什么意义呢?