如何创建一个可以包含基类和派生类的列表?

时间:2015-04-06 20:49:54

标签: c++

好的说我有一类刀片(基类)和刀片的子类,称为刀和剑

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);
};

现在我可以将这些插入到列表中;但是,我不知道如何从列表中访问它们任何有关如何操作的帮助如果它有助于子类确实具有output()函数将是很好的

2 个答案:

答案 0 :(得分:3)

您需要的是基类的唯一指针列表:

list<unique_ptr<base>> your_list;

然后,您可以使用base class derived类的实例填充它。

答案 1 :(得分:-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();
    }
}