如何制作一个既可以包含基类又可以包含派生类的列表

How to make a list that can hold both base classes and derived classes?

本文关键字:包含 派生 列表 基类 既可以 一个 何制作      更新时间:2023-10-16

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

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()函数

,那么关于如何访问它们的任何帮助都将是非常好的

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

list<unique_ptr<base>> your_list;

然后,您可以用basederived类的实例来填充这两个类。

要完成Roman的答案,您可能需要这样做: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();
    }
}