我有一个名为CBase
的抽象基类以及另外两个从CDerived1
派生的类CDerived2
和CBase
。
我现在如何创建CBase
的动态数组(即在运行时添加和删除元素)?当然,该数组只包含派生类的对象,因为基类是抽象的。
我会尝试这样的事情:
CBase* arr;
arr = (CBase*) malloc(arrSize*sizeof(CBase));
当我想根据需要调整数组大小时,这种解决方案会变得很复杂。我该怎么做?还是为此推荐其他类型的数组?
答案 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!