2012-09-25 54 views
1

我想複製C++中的對象。問題是,我已經派生類與多態,如I所示的僞代碼:C++複製多態對象

class BaseCl { some virtual functions }; 
class DerivedClass : public BaseCl { ... }; 

...

BaseCl * b1 = new DerivedClass(); 
BaseCl * b2 = new "copy of b1"; (just pseudocode) 

的問題是最後一行:

我想複製類「BaseCl」的一個對象,但由於多態性,副本必須與「DerivedClass」的原始對象相同。

這樣做的最好方法是什麼?

非常感謝你,任何幫助表示讚賞。

編輯:問題已經解決:

插入:

virtual BaseCl *clone() = 0; 

在基類和

DerivedCl *clone() {return new DerivedCl(*this);} 

在派生類。謝謝你們。

+0

這或多或少這裏所描述的同樣的問題:http://stackoverflow.com/questions/12447427/ c-maintain-a-mixed-collection-of-subclass-objects/12447459#12447459 –

回答

6

您需要在BaseC1中定義一個生成克隆的函數。喜歡的東西:

class BaseCl 
{ 
    virtual BaseCl* clone() {return new BaseC1(*this);} 
}; 
class DerivedClass : public BaseCl 
{ 
    virtual BaseCl* clone() {return new DerivedClass(*this);} 
}; 
+0

忘記輸入函數的返回值。我編輯了你的答案。 –

+0

你是對的,謝謝。 – CrazyCasta

+0

嗯,我得到另一個問題,當我嘗試這個: 虛擬BaseCl *克隆(){返回新的BaseCl(* this);} BaseCl.h:45:錯誤:無法分配抽象類型'BaseCl' ../BaseCl.h:21:注意:因爲以下虛函數在'BaseCl'內是純的: ... 那麼虛函數的問題呢? – MarkusX

0

運行時多態性的關鍵是操作必須在最派生的對象來實現,因爲它是一個比知道它有被稱爲執行他們的一切。所有基地都必須公開虛擬功能,以便由基本指針調用。

您可以在戴維尼基本級別的虛擬BaseCl* clone()功能,並重寫它的派生類return new DerivedClass(*this)