我有一个基类和几个派生类。基类如下所示:
class Base
{
int type; //the derived type the object belongs to
int nOfChildren;
Base** children; //each child can be any of the derived types
...
}
现在我需要复制Base
的实例。由于递归,需要虚拟方法Base::duplicate()
。它似乎也应该清楚:
Base temp = new Base();
temp->type = temp;
temp->nOfChildren = nOfChildren;
temp->children = new Base*[nOfChildren];
除此之外,还不是那么清楚。
我是否将每个temp->children[i]
分配为Base
个对象或派生对象?我是否需要一个案例陈述来满足所有可能的派生类型?我是否需要为每个派生类型实现duplicate()
方法,即使那些不包含除Base类之外的其他信息的方法? (如果派生类包含更多信息,那么很明显我需要一个单独的机制。虽然它们包含未显示的handler()
方法的不同实现,但有几个派生类不包含除基础之外的其他数据。 )
答案 0 :(得分:4)
你是对的,克隆多态对象需要一个虚方法。 OTOH,您可以利用C ++功能来简化编写:
class Child : public ICloneable {
public:
// stuff...
Child *clone() const { return new Child(*this); }
}
另外,不要将对象集合放入数组中!请改用std::vector
。
class Base
{
// stuff...
std::vector<Base*> children;
}
更好的是,使用智能指针将克隆操作包装到对象中std::vector
将能够透明地进行管理。
template<typename T>
struct clone_ptr {
T *object;
clone_ptr() : object(new T()) {}
clone_ptr(T *object_) : object(object_) {}
clone_ptr(clone_ptr<T> const &other) : object(other.object->clone()) {}
clone_ptr<T> &operator=(clone_ptr<T> other) {
std::swap(object, other.object);
return *this;
}
~clone_ptr() { delete object; }
};
通过这种方式,您可以在基地使用std::vector
clone_ptrs
:
class Base
{
// stuff...
std::vector<clone_ptr<Base>> children;
}
每个对象都将自动复制到具有相同多态类型的对象中,只要在每个类中实现clone()即可。该向量将以与其他数据成员相同的方式克隆,由C ++编译器自动克隆。