1

我正在做一个管理项目集合的程序。可以是书、杂志、CD 或 DVD。每一个都是继承类Item的类。要存储我使用列表模板的那些项目,如下所示:

list<Item> items;

这个列表在类库的一个对象库中。

要浏览此列表,我正在这样做:

for(list<Item>::iterator i = lib.itens.begin(); i != lib.itens.end(); ++i)

到此为止,一切都很好。当我尝试在此循环中调用派生类的方法时,问题就开始了。例子:

    for(list<Item>::iterator i = lib.itens.begin(); i != lib.itens.end(); ++i)
        (*i).lib.itens.show();

我怎样才能调用这些方法?

4

2 回答 2

2

这里至少有两个问题。首先,如果你这样做:

list<Item> items;

那么这个列表真的只会包含Item对象;如果您尝试放入派生对象,则派生部分将被简单地切掉

一种解决方案是改用指针列表(尽管您可能应该使用智能指针来避免内存管理问题)。

但即便如此,第二个问题是您不应该(通常)尝试通过指向基类的指针来调用特定于派生类的方法。多态性的全部意义在于,如果您乐于使用整个层次结构共有的功能,您应该只处理基类指针(请参阅Liskov 替换原则)。

于 2012-05-25T01:24:54.267 回答
0

您可能应该virtual void show() = 0;class Item. 这将使show调用合法,但同时会导致list<Item>.

基本错误是您不能拥有“只是” an 的东西Item,但list<Item>会尝试列出精确的列表。通过在 中声明show为纯虚函数Item,编译器明确地知道这一点。

于 2012-05-25T07:34:58.970 回答