我有一個函數,它需要一個指向超類的指針並對其執行操作。但是,在某些時候,該功能必須對輸入的對象進行深層複製。有什麼辦法可以執行這樣的副本嗎?我可以傳遞一個指向超類的指針,但是創建一個孩子的副本?
讓我想起使該函數成爲模板函數,並簡單地讓用戶傳遞類型,但我堅持希望C++提供更優雅的解決方案。
我有一個函數,它需要一個指向超類的指針並對其執行操作。但是,在某些時候,該功能必須對輸入的對象進行深層複製。有什麼辦法可以執行這樣的副本嗎?我可以傳遞一個指向超類的指針,但是創建一個孩子的副本?
讓我想起使該函數成爲模板函數,並簡單地讓用戶傳遞類型,但我堅持希望C++提供更優雅的解決方案。
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); }
};
clone
是const
方法clone
返回指向當前類的指針,而不是基類clone
返回當前對象第2的副本是非常重要的,因爲它允許使用到的事實,有時你必須不僅僅是一個Super*
更多類型的信息中受益。
此外,我通常更喜歡clone
提供一個副本,而不僅僅是一個相同類型的新對象。否則,您正在使用Exemplar
模式來構建新對象,但是您無法正確克隆,名稱有誤導性。
我在wxWidgets中看到的一個例子是定義一個覆蓋方法'clone',以便在每個類中都可以進行適當的深度複製,但該方法將副本作爲超類返回。
(再有,其中與實施例其他的答案)
+1這是正確的答案。 – 2010-06-17 17:14:09
謝謝你指出這些。 – 2010-06-19 10:36:58