3

我有一个函数,它接受一个指向超类的指针并对其执行操作。但是,在某些时候,该函数必须对输入的对象进行深层复制。有什么办法可以进行这样的复制吗?

我想到将函数设为模板函数并简单地让用户传递类型,但我希望 C++ 提供更优雅的解决方案。

4

2 回答 2

12

SpaceCowboy 提出了惯用的clone方法,但忽略了 3 个关键细节:

class Super
{
public:
  virtual Super* clone() const { return new Super(*this); }
};

class Child: public Super
{
public:
  virtual Child* clone() const { return new Child(*this); }
};
  1. clone是一种const方法
  2. clone返回指向当前类的指针,而不是基类
  3. clone返回当前对象的副本

第二个非常重要,因为它允许使用受益于有时你有更多类型信息而不仅仅是Super*.

另外,我通常更喜欢clone提供一个副本,而不仅仅是一个相同类型的新对象。否则,您正在使用一种Exemplar模式来构建新对象,但您没有正确克隆并且名称具有误导性。

于 2010-06-17T17:09:01.200 回答
2

我在 wxWidgets 中看到的一个示例是定义一个覆盖方法“克隆”,以便在每个类中您都可以进行适当的深层复制,但该方法将副本作为超类返回。

(然后有其他答案的例子)

于 2010-06-17T16:29:09.440 回答