基类中用克隆代替复制
-
在构建类层次结构是,我们通常都是想要获得多态行为。我们需要对象一旦创建就能保持其类型和标识。但是在想复制一个对象时会发现C++中的对象复制语义与这一目标是冲突的,因为构造函数都是与类名相同的,也就是构造函数都是每个类特有的,复制构造函数不能设为虚拟的。
为了用基类指针(或引用)正确的将对象进行复制,更为通用的惯用法解决方案是,将基类的复制构造函数设为protected甚至是public,并改而依赖于一个虚拟的clone函数。例如particle类中//- Construct as a copy particle(const particle& p); //- Construct a clone virtual autoPtr<particle> clone() const { return autoPtr<particle>::New(*this); } //Constructor Foam::particle::particle(const particle& p) : mesh_(p.mesh_), coordinates_(p.coordinates_), celli_(p.celli_), tetFacei_(p.tetFacei_), tetPti_(p.tetPti_), facei_(p.facei_), stepFraction_(p.stepFraction_), origProc_(p.origProc_), origId_(p.origId_) {} 在派生类KinematicParcel中 //- Construct as a copy KinematicParcel(const KinematicParcel& p); //- Construct and return a (basic particle) clone virtual autoPtr<particle> clone() const { return autoPtr<particle>(new KinematicParcel(*this)); }
通过虚拟函数clone就能正确的实现复制功能啦!