在堆上创建多态对象的数据成员向量?

mez*_*hic 3 c++ polymorphism vector

我有一个继承层次结构,其中A是抽象基类,B和C是多态子.

我希望在堆上有一个vector类数据成员,它可以包含B和C对象.

所以在头文件中我有我的

vector<A*> polymorphicobjs;
Run Code Online (Sandbox Code Playgroud)

在我试图做的构造函数中:

polymorphicobjs = new vector<A>();
Run Code Online (Sandbox Code Playgroud)

但显然这不起作用.我该如何实现这一目标?

Bre*_*hns 5

你不应该担心保留一个std::vector原始指针.稍后确保您在正确的时间删除对象会给您带来很多麻烦.你应该做的是存储一个"托管"多态对象的容器(使用智能指针).声明你的向量:

std::vector<std::unique_ptr<A>> polymorphicobjs;
Run Code Online (Sandbox Code Playgroud)

现在,您可以非常轻松地在向量中存储多态对象(其中B是子类A):

polymorphicobjs.push_back(std::unique_ptr<B>(new B));
Run Code Online (Sandbox Code Playgroud)

有了这个,您无需担心调用delete向量中的对象.只要你"放开"向量(例如,当它超出你的函数中的范围,或者如果它是类成员则自动被破坏),对象将被删除.矢量唯一地拥有对象.

但我需要与其他代码共享对象?!

如果是这样的话,则std::unique_ptr不是正确的选择.我们可以表达的对象共享使用std::shared_ptr:

std::vector<std::shared_ptr<A>> polymorphicobjs;
// [...]
polymorphicobjs.push_back(std::make_shared<B>());
Run Code Online (Sandbox Code Playgroud)

为什么push_back独特和共享的外观不同?

因为C++ 14还没有出来.如果你足够幸运地使用足够新的编译器(前沿clang/gcc/VS2013),那么唯一版本看起来非常相似:

// C++14
std::vector<std::unique_ptr<A>> polymorphicobjs;
// [...]
polymorphicobjs.push_back(std::make_unique<B>());
Run Code Online (Sandbox Code Playgroud)