好吧,Derived 数组不是 Base 数组。
如果您需要将 a 向上Derived*
转换为 a Base*
,您应该分配一个指向 Base 的指针数组,或者最好是 avector<Base*>
vector<Base*> data(100);
// Initialize the elements
for (vector<Base*>::iterator it = data.begin(); it != data.end(); ++it)
{
*it = new Derived;
}
doStuff(data);
// Destroy the elements
for (vector<Base*>::iterator it = data.begin(); it != data.end(); ++it)
{
delete *it;
}
你的doStuff
功能变成:
void doStuff(const vector<Base*>& data)
{
// Copy the objects, not the pointers
vector<Base*> newdata;
for (vector<Base*>::const_iterator it = data.begin();
it != data.end(); ++it)
{
newdata.push_back((*it)->clone());
}
// Do stuff
// Destroy the copies
for (vector<Base*>::iterator it = newdata.begin();
it != newdata.end(); ++it)
{
delete *it;
}
}
请注意,要在不知道它们是Base
or的情况下复制对象Derived
,我们需要使用虚拟构造函数 idiom。它需要修改Base
,Derived
如下所示:
struct Base{
...
virtual Base* clone() const { return new Base(*this); }
virtual ~Base() {}
};
struct Derived : public Base {
...
Derived* clone() const { return new Derived(*this); }
};