使用向量存储从同一父类c ++继承的不同对象

时间:2013-04-15 18:15:59

标签: c++ inheritance vector polymorphism

我有一节课,我们称之为多项式。

预先知道所需多项式的数量,并在运行时确定。我当前的实现使用了一个容器类,我们称之为解决方案,其中有一个向量,我们称之为polynomialVector,它是这样定义的:

 std::vector<Polynomial> polynomialVector;

以这种方式创建和填充向量(解决方案的构造函数执行此工作):

polynomialVector.reserve(numberofneededpolynomials);
for(int i = 0; i < numberofneededpolynomials ; i++) {
 polynomialVector.emplace_back(0) //Polynomial constructor takes an int parameter
}

现在我想创建将继承通用多项式类的特定类型的多项式。多项式的类型将由用户在运行时确定。例如,如果用户输入0,则使用一般多项式类,如果输入1,则使用特定的派生多项式类,对于类型2,使用不同的特定类型的多项式等。

我在示例中看到过这可以使用常规数组来完成:

Polynomial * polynomial1 = new DerivedPolynomial1(parameters);
Polynomial * polynomial2 = new DerivedPolynomial2(parameters);
Polynomial * arrayPolynomial[2] = {polynomial1, polynomial2};

但是我需要使用向量来实现它,因为应用程序会创建许多不同的多项式(由多项式类随机创建,但这不相关),这是事先不知道的。我包含Polynomial类(Solutions类)的整个代码已经编码为vector。

我需要做这样的事情:

cin >> type;
if(type == 0) {
 polynomialVector.reserve(numberofneededpolynomials);
 for(int i = 0; i < numberofneededpolynomials ; i++) {
  *create polynomial of type 0 in a similar way that emplace_back does for the general case that I described*
 }
if(type == 1) {
  ... same thing but for type 1
}

怎么做?

2 个答案:

答案 0 :(得分:4)

要在std :: vector中存储多态数据类型,您需要存储指针。

为了确保代码不会泄漏内存,最简单的方法是使用智能指针。

std::vector<std::unique_ptr<Polynomial>> polynomialVector;
polynomialVector.emplace_back(new DerivedPolynomial1(parameters));

我假设您使用C ++ 11,因为您的代码使用emplace_back

答案 1 :(得分:0)

你应该将它们存储为指针,如下所示:

std::vector<Polynomial *> polynomialVector;
                       ^

此外,您必须处理内存(new / delete)并将派生对象作为指向vector的指针。

随意使用std::unique_ptrstd::shared_ptr代替简单指针:

std::vector<std::unique_ptr<Polynomial>> polynomialVector;

std::vector<std::shared_ptr<Polynomial>> polynomialVector;