C++ 将派生类的对象保存在基c的std::list中

C++ 将派生类的对象保存在基c的std::list中,c++,class,inheritance,stdlist,C++,Class,Inheritance,Stdlist,我试图保存一个X类的对象,它是从std::list中的基类Y派生的。X类有Y类没有的东西,当我将对象保存到std::list时,对象切片就发生了。有更多不同的类使用Y作为基,因此为了简单起见,只使用一个存储将是理想的,因为它们有不同的成员,所以使用static_cast并没有像预期的那样工作。这个问题有解决办法吗?或者我应该放弃它,为每种类型使用不同的容器吗?保留一个Y*列表。然后,您可以使用完整的虚拟函数解析,如果需要的话,您可以使用动态_cast,尽管我建议您不要这样做 后一种情况的原因是,

我试图保存一个X类的对象,它是从std::list中的基类Y派生的。X类有Y类没有的东西,当我将对象保存到std::list时,对象切片就发生了。有更多不同的类使用Y作为基,因此为了简单起见,只使用一个存储将是理想的,因为它们有不同的成员,所以使用static_cast并没有像预期的那样工作。这个问题有解决办法吗?或者我应该放弃它,为每种类型使用不同的容器吗?

保留一个Y*列表。然后,您可以使用完整的虚拟函数解析,如果需要的话,您可以使用动态_cast,尽管我建议您不要这样做

后一种情况的原因是,通常有一个原因可以解释为什么要保留一个Y的列表而不是其他的东西。

之所以会这样,是因为您可以有效地按值复制列表中的元素。使用

std::list<std::unique_ptr<Y>> 
或者,如果你需要共享所有权

std::list<std::shared_ptr<Y>> 
相反,最好交换名称X和Y,因为通常Y是从X派生的


在不需要共享所有权的情况下,应该使用std::unique\u ptr,在这种情况下,确保std::将元素移入和移出列表。std::unique\u ptr没有std::shared\u ptr无引用计数的开销,与原始指针一样快/小。

或者只是动态\u cast。不,不是动态\u cast,OP问题的正确解决方案是动态\u cast。在这里,重新解释_cast毫无意义。不管使用哪种类型的cast,实际的解决方案是保留指针,而不是对象。X是从Y派生的?你真的只是想搞乱大家的头脑,不是吗。像Foo&operator++;//我希望这只是为了和人捣乱。X确实是从Y@TahOmegaFire即使在你的代码中,X是从Y派生出来的,你仍然可以用不同的方式问这个问题,用Y代替X,反之亦然。这样,可能只有你一个人有点混乱,但所有其他人都会更快地理解这个问题?这是一个真正的解决办法。您的代码做得更多,成本更高。@KerrekSB我只是想对std::unique\u ptr做一个额外的编辑。但是,您可能并不总是希望在列表中移动。如果只有一个子对象,则无法复制派生对象,因此这不是问题。如果有克隆机制,可以使用合适的值\u ptr或克隆\u ptr。我认为这几乎是偶然的?别名共享指针将带来更大的灾难。@KerrekSB让我想一想,并在之后进行编辑,感谢您的评论。换句话说,您提出的解决方案是一个等待发生的竞争条件,或者一个会让您或更可能让您的替代者花费整个圣诞假期才能找到的bug:-