【问题标题】:Store BASE-DERIVED class in same container将 BASE-DERIVED 类存储在同一个容器中
【发布时间】:2020-07-06 02:59:32
【问题描述】:

我的概念(非真实)类层次结构为:

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> 其他班级被削减时。我什至不能将它们作为指针存储在容器上,因为指针仍然具有不同的类型。

【问题讨论】:

  • 堆分配它们并使用std::vector<:unique_ptr>>你能详细说明一下吗

标签: c++ class oop containers hierarchy


【解决方案1】:

通常将它们放在同一个容器中的唯一原因是将它们用作基本类型,利用多态性根本不关心特定类型是什么。这需要使用虚拟方法。例如:

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&amp;)),我们可以通过指向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!

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多