我有一个纯虚基类和几个派生类,我需要克隆派生的类。我最初这样做了:
struct base {
virtual base* clone() = 0;
}
struct derived: public base {
base* clone() {
derived* d = new derived;
/*copy members, etc.*/
return d;
}
}
这很好用,除了返回的类型(它是派生类型之一)之外,我所有派生类中的clone函数实现都是IDENTICAL。换句话说,我在克隆过程中所做的所有操作都是基类共有的。所以,我接下来要做的是在我的基类中添加一个模板函数:
struct base {
virtual base* clone() = 0;
template <typename T>
T* make_clone() {
T* d = new T;
/*copy members, etc.*/
return d;
}
}
struct derived: public base {
base* clone() {return base::make_clone<derived>();}
}
这也有效,但它似乎有点不优雅,我觉得应该有一个更简洁的方法,更少的函数调用和消除所有派生类中的单行函数。是否有一些语言功能或设计模式,我可以用它来清理这一点?另外,为了澄清,调用者不知道它需要克隆的base*
的派生类型。否则我可以直接拨打base::make_clone<derived>
。
答案 0 :(得分:1)
您可以使用CRTP:
template <typename Derived>
struct derived_base : base
{
Derived* clone()
{
Derived* x = new Derived;
// ...
return x;
}
};
struct derived : derived_base<derived> {}