emplace_back和继承

时间:2013-01-20 01:29:27

标签: c++ inheritance vector c++11

我想知道你是否可以使用emplace_back将项目存储到一个向量中,这是一种从向量所期望的类派生的类型。

例如:

struct fruit
{
    std::string name;
    std::string color;
};

struct apple : fruit
{
    apple() : fruit("Apple", "Red") { }
};

其他地方:

std::vector<fruit> fruits;

我想在向量中存储apple类型的对象。这可能吗?

2 个答案:

答案 0 :(得分:9)

没有。向量仅存储固定类型的元素。你想要一个指向对象的指针:

#include <memory>
#include <vector>

typedef std::vector<std::unique_ptr<fruit>> fruit_vector;

fruit_vector fruits;
fruits.emplace_back(new apple);
fruits.emplace_back(new lemon);
fruits.emplace_back(new berry);

答案 1 :(得分:2)

std::vector<fruit> fruits; 它只在水果中存储水果而不是派生类型,因为分配器只为每个元素分配sizeof(fruit)。为了保持多态性,你需要将指针存储在水果中。

std::vector<std::unique_ptr<fruit>> fruits;
fruits.emplace_back(new apple);

apple是在免费商店中动态分配的,当元素从vector中删除时将被释放。

fruits.erase(fruits.begin());