动态抽象类数组

时间:2019-05-23 00:09:22

标签: c++ arrays abstract-class

我有一个名为CBase的抽象基类以及另外两个从CDerived1派生的类CDerived2CBase

我现在如何创建CBase的动态数组(即在运行时添加和删除元素)?当然,该数组只包含派生类的对象,因为基类是抽象的。

我会尝试这样的事情:

CBase* arr;
arr = (CBase*) malloc(arrSize*sizeof(CBase));

当我想根据需要调整数组大小时,这种解决方案会变得很复杂。我该怎么做?还是为此推荐其他类型的数组?

1 个答案:

答案 0 :(得分:1)

您正在分配CBase对象的数组,因此当您尝试将派生对象分配给数组元素时,它将受到object slicing的影响。您真正需要的是一个CBase*指针数组:

CBase** arr;
arr = new CBase*[arrSize];

arr[0] = new CDerived1;
...

for (int i = 0; i < arrSize; ++i)
    delete arr[i];
delete [] arr;

话虽如此,您实际上应该使用std::vector而不是new[],并且在C ++ 11和更高版本中,更喜欢使用std::unique_ptr而不是原始指针:

#include <vector>
#include <memory>

std::vector<std::unique_ptr<CBase>> arr;
arr.reserve(arrSize);

arr.push_back(std::unique_ptr<CBase>(new CDerived1));
// or, in C++14 and later:
// arr.push_back(std::make_unique<CDerived1>());
...

//no manual cleanup needed!