Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/145.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 创建用于存储多个类型的容器_C++_Containers - Fatal编程技术网

C++ 创建用于存储多个类型的容器

C++ 创建用于存储多个类型的容器,c++,containers,C++,Containers,我有一个包含纯虚函数的类。我使用这个类是为了确保我不会忘记在派生类中实现一些方法 我有一个派生类的集合,比如 class B : public A class C : public A class D : public A etc 如何创建一个容器来容纳所有这些派生类B、C、D?我更喜欢使用标准容器,如vector。我尝试创建基类的向量,但如果将派生类推送到向量上,则会导致编译错误,即抽象类类型的无效新表达式 我的基类: class A { public: A(); virt

我有一个包含纯虚函数的类。我使用这个类是为了确保我不会忘记在派生类中实现一些方法

我有一个派生类的集合,比如

class B : public A
class C : public A
class D : public A 
etc
如何创建一个容器来容纳所有这些派生类B、C、D?我更喜欢使用标准容器,如vector。我尝试创建基类的向量,但如果将派生类推送到向量上,则会导致编译错误,即抽象类类型的无效新表达式

我的基类:

class A
{
public:
    A();
    virtual ~A();

    virtual double GetVolume() = 0;
};
派生类示例:

class B : public A
{
public:
    B(){};
    virtual ~B(){};

    double GetVolume(){};
};

您需要创建一个指向base的指针容器。基本对象的容器导致从派生对象到基本对象的转换,这称为切片。但是,当您有一个指向基类的指针时,对象仍然可以有一个不同于基类的派生类型,这称为对象的动态类型,而不是静态类型

<>在现代C++中,最好使用智能指针:
std::vector<std::unique_ptr<A>> x;
x.push_back(std::make_unique<B>());
x.push_back(std::make_unique<C>());
x.push_back(std::make_unique<D>());

for (auto& e : x) {
    e->GetVolume();
}

@πάνταῥεῖ 我不认为这是一个合适的复制,这里的答案不太可能是boost::any类型,而是一个工厂方法,并将std::shared_ptr存储到一个…@Ben Vote重新打开。可能更接近这个:,但不是真的……它可能是某个东西的复制品,但肯定不是正确的复制品。在这个问题中,您有一个继承层次结构,在链接的问题中,它们是三个不相关的类型。现在这个用户将使用variant/any而不是简单的多态性。。。我认为这是一种积极的误导,是对用户的一种伤害。相反,这一条怎么样:使用emplace\u back和push\u back会更好吗?@Adam在这种情况下没有太大区别。因为unique_ptr非常简单,移动成本也很低,所以性能不会有多大影响,而且不管怎样,毫无保留地调用push_back都不会有很好的性能。如果我已经有了对象或者可以隐式转换为对象的东西,我通常更喜欢将push_推回emplace_,因为性能不是问题。函数签名更简单;如果你搞砸了,你会得到更好的错误消息,IDE也会提供更好的帮助。