很抱歉混淆了这个话题,这是原来的问题:
如何重新分配指向基类的指针数组,实际上 指向不同的派生类?
如果可能,我不应该在这里使用动态强制转换,typeid或RTTI ..
编辑我刚刚意识到我可以尝试保存数组元素,只需将新数组中的指针设置为旧元素。但是,如何做operator =或Cctor?
或者:
如何通过实际复制元素来重新分配这个数组“坏方法”?
一个例子:
class Base {...}
class Derived1 : public Base {...}
class Derived2 : public Base {...}
int main()
{
int arrayLength=0, arrayMaxLength=3;
Base **array=new Base*[arrayMaxlength];
array[0]=new Derived1();
array[1]=new Derived2();
//Reallocation starts...
Base **tmp=new Base*[arrayMaxLength*=2];
for(int i=0;i<arrayLength;i++)
tmp[i]=new Base(*array[i]); //<------ What to put here instead of Base?
//The unimportant rest of Reallocation..
for(int i=0;i<arrayLength;i++)
delete array[i];
delete [] array;
array=tmp;
}
答案 0 :(得分:1)
您不需要进行任何转换(动态或其他):只需重用指针
Base **array=new Base*[arrayMaxlength];
array[0]=new Derived1();
array[1]=new Derived2();
//Reallocation starts...
Base **tmp=new Base*[arrayMaxLength*=2];
for(int i=0;i<arrayLength;i++)
tmp[i]=array[i];
// ...
对象已经分配并具有正确的类型。您只需将指针本身复制到新数组即可。
注意你必须注意不要在旧数组中delete
(指向的对象)指针,因为这会使新数组中的指针无效(存储指针所指向的对象不再存在) - 只需删除原始数组iself。
如果指针管理变得繁琐,你可以使用某种共享指针(例如BOOST库提供各种各样的指针)