2010-06-17 18 views

回答

11

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. cloneconst方法
  2. clone返回指向當前類的指針,而不是基類
  3. clone返回當前對象

第2的副本是非常重要的,因爲它允許使用到的事實,有時你必須不僅僅是一個Super*更多類型的信息中受益。

此外,我通常更喜歡clone提供一個副本,而不僅僅是一個相同類型的新對象。否則,您正在使用Exemplar模式來構建新對象,但是您無法正確克隆,名稱有誤導性。

+1

+1這是正確的答案。 – 2010-06-17 17:14:09

+0

謝謝你指出這些。 – 2010-06-19 10:36:58

2

我在wxWidgets中看到的一個例子是定義一個覆蓋方法'clone',以便在每個類中都可以進行適當的深度複製,但該方法將副本作爲超類返回。

(再有,其中與實施例其他的答案)

相關問題