在簡單的例子繼承層次:在C++中乾淨地複製一個基類或子類的實例?
class Food
{
virtual ~Food();
};
class Fruit : public Food
{
virtual ~Fruit();
};
class Apple: public Fruit
{
virtual ~Apple();
}
class Vegetable: public Food
{
virtual ~Vegetable();
}
我想創建一個可以克隆其子類或基類的實例對象的方法:
Apple* apple1 = new Apple();
Apple* clone1 = apple1->clone();
Food* food1 = apple1;
Apple* clone2 = food1->clone();
我看到一些可能的解決問題的方案:
使用多態性來創建一個爲每個子類顯式定義的虛函數。
使用模板工廠方法獲取類的實例和子類的類型以創建新實例。
向其他地方存儲的每個類和子類註冊一個id,以查找在調用基類複製函數時要創建哪個子類。
這些都不看起來是理想的,但我更傾向朝着第三解決方案,它可以簡化調用clone函數,而無需爲每個子類中要寫入的定義(這會有很多)。
但是,我非常樂意提供任何建議,有沒有更好的方法來做到這一點?
@DeadMG:您的解決方案似乎不適用於OP的類層次結構。你能告訴你如何解決這個層次問題:Food < - Fruit < - Apple,這樣所有的類都可以克隆? – 2010-10-23 14:16:02
@Alf:你錯了,因爲我錯過了Fruit中介課程,所以我會編輯。 – Puppy 2010-10-23 14:20:38
@DeadMG:在OP的例子中,這些(顯然)是具體的類。現在它們是抽象的。需要克隆的層次結構具體實例(在C++ 98中)是一個異常類層次結構。那麼,你們也許可以讓這些課程具體化嗎?這樣所有的課程都是可克隆的?乾杯, – 2010-10-23 14:31:28