2015-04-06 20 views
0

好了,所以說,我有一個類葉片(基類),並呼籲刀和劍如何創建一個可以同時擁有基類和派生類的列表?

class blades{ 
... 
} 
class knifes:public blades{ 
... 
} 
class swords:public blades{ 
... 
} 

現在我想通過的#include 列表,可以存儲大約刀和劍的信息葉片的一個子類

int main(){ 
    knifes k1; 
    swords swd1; 
    list<blades> list; 
    k1.input(); 
    list.push_front(k1); 
    swd1.input(); 
    list.push_front(swd1); 
}; 

現在我可以將這些進入名單;但是,我不知道如何從列表中訪問這些有關如何這樣做將是巨大的,如果它可以幫助子類確實有輸出任何幫助( )功能

+1

你需要將它們存儲在列表指針。您不能按值存儲多態項目,它們必須存儲爲指針。 – Lalaland

回答

3

你需要的是獨特的指針指向基類的列表:

list<unique_ptr<base>> your_list; 

然後,您可以用base類和derived類的實例來填充它兩者。

+1

在這種情況下,unique_ptr可能被認爲更具慣用性。 – Lalaland

+0

是的,我完全同意。更新了答案。 – grzkv

-1

要完成羅馬的答案,您可能會喜歡這樣的:https://limbioliong.wordpress.com/2013/01/03/storing-c-objects-in-a-stl-vector-part-3/。它是關於矢量的,但它對列表完全一樣。

編輯:利用這一點,這裏是在網站上給出的完整的例子(注意dynamic_cast的獲得派生類對象):

typedef unique_ptr<Base> BasePtr; 
std::list<BasePtr> listBasePtr; 

listBasePtr.push_front(BasePtr(new Base(0))); 
listBasePtr.push_front(BasePtr(new Derived(1, 2))); 

std::list<BasePtr>::iterator theIterator; 

for (theIterator = listBasePtr.begin(); theIterator != listBasePtr.end(); theIterator++) 
{ 
    BasePtr& base_ptr = (BasePtr&)(*theIterator); 

    base_ptr -> func(); 

    Derived* pDerived = dynamic_cast<Derived*>(base_ptr.get()); 

    if (pDerived) 
    { 
     pDerived -> func(); 
    } 
} 
+2

如果您的答案在沒有鏈接內容的情況下無內容,您的答案不是答案:它是一個鏈接。答案必須獨立,沒有任何鏈接的內容(正如SO發現異地鏈接不夠持久)。 – Yakk

+0

好吧,現在可以嗎? – StormRider

+0

你是否有合法的權利重新發布?道德權利?通過在此處發佈,您將特定的許可證附加到代碼中,並且您複製它的人可能不同意您的使用。一般來說,寫你自己的答案:然後,如果他們提供豐富,包括鏈接。 – Yakk

相關問題