0

我有 :

class Library
{
private:
list<Publication> L;
}
class Publication
{
protected:
string title;
string editor;
}

class Book:public Publication
{
private:
vector<string> Author;
}

当我在我的列表中插入一本书时,我失去了作者?如果不是,当我想显示列表中的一个出版物时,我还想显示该出版物的作者。我怎样才能在不修改列表结构的情况下做到这一点?

4

2 回答 2

1

如果不更改L. 它是一个list<Publication>- 它存储Publications,而不是Books。如果您将 a 推Book入其中,它将被切成薄片,只剩下Publication部分。

如果要以Publication多态方式存储 s,则需要使用指针或引用。我建议使用以下方法之一:

// 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.

于 2013-03-19T17:05:26.000 回答
1

您正在存储Publication对象,因此当您尝试存储时Books,您会得到对象切片。解决方案是将智能指针存储到Publications. 例如,

#include <memory>
class Library
{
private:
  std::list<std::unique_ptr<Publication>> L;
};
于 2013-03-19T17:05:39.633 回答