将 BASE 派生类存储在同一容器中



我的概念(不是真实的(类层次结构为:

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!

如果不能像这样将容器中的所有对象视为基本实例,那么几乎没有理由将它们放在同一个容器中 - 有什么意义呢?

最新更新