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

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

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

所以在头文件中我有我的

vector<A*> polymorphicobjs;

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

polymorphicobjs = new vector<A>();

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

解决方法:

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

std::vector<std::unique_ptr<A>> polymorphicobjs;

现在你可以很容易地在向量中存储多态对象(其中B是A的子类):

polymorphicobjs.push_back(std::unique_ptr<B>(new B));

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

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

如果是这种情况,那么std :: unique_ptr不是正确的选择.我们可以通过使用std :: shared_ptr表示对象是共享的:

std::vector<std::shared_ptr<A>> polymorphicobjs;
// [...]
polymorphicobjs.push_back(std::make_shared<B>());

为什么push_back对于unique和shared来说看起来有所不同?

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

// C++14
std::vector<std::unique_ptr<A>> polymorphicobjs;
// [...]
polymorphicobjs.push_back(std::make_unique<B>());
上一篇:侵犯隐私 – C标准如何处理它?


下一篇:c – 与新数据成员的多态性