直接上模板工具类:
template <typename Base, typename Derived>
class Cloneable : public Base
{
public:
using Base::Base;
virtual Base *clone() const
{
return new Derived(static_cast<Derived const &>(*this));
}
};
使用方法示例:
基类Vehicle
class Vehicle
{
protected:
int fuelCapacity;
public:
Vehicle() {};
Vehicle(int fuelCapacity) : fuelCapacity(fuelCapacity) {};
virtual ~Vehicle() {};
virtual Vehicle *clone() const = 0;
virtual void describe() const = 0;
};
一级子类Plane,使用了Cloneable模板生成了clone方法:
class Plane : public Cloneable<Vehicle, Plane>
{
private:
typedef Cloneable<Vehicle, Plane> BaseClass;
protected:
int wingSpan;
public:
Plane() {};
Plane(int fuelCapacity, int wingSpan) : BaseClass(fuelCapacity), wingSpan(wingSpan) {};
virtual void describe() const
{
std::cout << "I am a plane" << std::endl;
}
};
二级子类FighterPlane,同样也能使用Cloneable模板生成clone方法:
class FighterPlane : public Cloneable<Plane, FighterPlane>
{
private:
typedef Cloneable<Plane, FighterPlane> BaseClass;
protected:
int numberOfBombs;
public:
FighterPlane() {};
FighterPlane(int fuelCapacity, int wingSpan, int numberOfBombs)
: BaseClass(fuelCapacity, wingSpan), numberOfBombs(numberOfBombs) {};
virtual void describe() const
{
std::cout << "I am a fighter plane" << std::endl;
}
};
clone方法在C++11后更好的实现方式是返回unique_ptr,例子为了简化使用了原始指针方式表示。
参考:
C++: Polymorphic cloning and the CRTP (Curiously Recurring Template Pattern)
参考内含有详细的解释。