我有:
class Library
{
private:
list<Publication> L;
}
class Publication
{
protected:
string title;
string editor;
}
class Book:public Publication
{
private:
vector<string> Author;
}
当我在我的名单上插入一本书时,我失去了作者?如果不是,当我想显示列表中的一个出版物时,我想要显示出版物的作者。如何在不修改列表结构的情况下做到这一点?
答案 0 :(得分:1)
如果不更改L
的类型,则无法执行此操作。它是list<Publication>
- 它存储Publication
,而不是Book
。如果您将Book
推入其中,它将被切片,只留下Publication
部分。
如果要以多态方式存储Publication
,则需要使用指针或引用。我建议使用以下之一:
// When the Library has sole-ownership of a dynamically allocated Publication:
std::list<std::unique_ptr<Publication>> L;
// When the Library has shared-ownership of a dynamically allocated Publication:
std::list<std::shared_ptr<Publication>> L;
// When the Library wants a reference to a Publication:
std::list<std::reference_wrapper<Publication>> L;
如果出于任何原因你不能使用其中任何一个,你当然可以在L
中存储原始指针。
答案 1 :(得分:1)
您正在存储Publication
个对象,因此当您尝试存储Books
时,您会获得object slicing。解决方案是将smart pointers存储到Publications
。例如,
#include <memory>
class Library
{
private:
std::list<std::unique_ptr<Publication>> L;
};