2012-05-25 79 views
1

我在做一個管理項目集合的程序。這可以是一本書,一本雜誌,一張CD或一張DVD。其中每個類都是繼承類Item的類。要存儲這些項目,我使用列表模板,如下所示:派生類的調用方法

list<Item> items; 

並且此列表位於類庫的對象庫內。直到此時一切都很好

for(list<Item>::iterator i = lib.itens.begin(); i != lib.itens.end(); ++i) 

要通過這個列表運行我這樣做。當我嘗試在這個循環內調用派生類的方法時,問題就開始了。例如:

for(list<Item>::iterator i = lib.itens.begin(); i != lib.itens.end(); ++i) 
     (*i).lib.itens.show(); 

我該如何調用這些方法?

回答

2

這裏至少有兩個問題。首先,如果你這樣做:

list<Item> items; 

那麼這個名單確實將只包含Item對象;如果您嘗試放入派生的對象,派生的部分將僅僅是sliced off

一種解決方案是使用指針列表來代替(儘管您應該使用智能指針來避免內存管理問題)。

但即使如此,第二個問題是,你不應該(通常)試圖通過指向基類的指針調用派生類特定的方法。多態性的要點在於,如果您願意使用整個層次結構中通用的功能(請參閱Liskov substitution principle),則應該只處理基類指針。

+0

好的,我該如何做一個能夠存儲任何派生類的對象的列表? – Gonzo

+0

您需要使用列表而不是列表。參考文件是多態的。 – Carl

+0

以及如何訪問這些項目?並將項目添加到列表中? – Gonzo

0

您可能應該在class Item中定義virtual void show() = 0;。這將使show調用合法,但同時會導致在list<Item>上發生錯誤。

最根本的錯誤是,你不能有一個「只是」Item,但list<Item>會試圖製作一個清單。通過在Item中聲明show爲純虛函數,編譯器明確知道這一點。

相關問題