继承类的继承集合

3

我目前有两个类: itemcatalog; 后者包含了一个item列表以及一些处理它们的方法:

class item {
    int index;
    vector<item*> related_items;
    // other member variables and functions
}

class catalog {
    size_t length;
    item* items;
public:
    catalog(size_t l);
    ~catalog();         // delete[] items;
    // other member variables and functions
}

catalog::catalog(size_t l) {
    items = new item[length = l];
    // Set properties of new items
}

我认为,即使items是一个vector<item>,也不会有任何区别。部分item的初始化,例如填充列表related_items,需要完整的item集合,因此在catalog构造函数中完成。

现在,我想定义新的类:book表示特定类型的item,而library是一种包含bookcatalog类型。我希望library构造函数分配内存以容纳某个数量的book,然后按照与catalog完全相同的方式初始化从item继承的这些book成员。接下来,它将进一步初始化book的其余成员。

我的最初想法是使它们成为itemcatalog的派生类。但由于目前情况下,library无法作为catalog的派生类,因为catalog具有指向基类对象数组的指针。实现这种结构的“最佳”方法是什么?


3
模板和模板特化,也许? - Some programmer dude
1
图书馆从目录继承有什么问题吗?它也会指向一个项目数组,但在您的情况下,所有这些项目都将是书籍。 - Othman Benchekroun
@Othman 那你就会出现对象切割,因为“items”是由“item”*对象组成的数组。 - Some programmer dude
语法上有效的示例不会有害。 - Lightness Races in Orbit
@JoachimPileborg:不是的。它是指向具有“item”作为基础的零个或多个对象的指针。如果添加了一些“virtual”,那就是这样。 - Lightness Races in Orbit
显示剩余2条评论
1个回答

2
如果catalog包含指针的数组,例如std::vector<std::unique_ptr<item>>,那么它可以容纳任何item的子类型。继承cataloglibrary可以有仅接受book(继承自item)的成员函数,并且在返回书籍引用时可以适当地转换指针(或者您想对它们做什么都可以)。
另一种选择是使用模板:
template<class T>
class catalog {
    std::vector<T> items;
};

class library: public catalog<book> {
    // ...
};

模板的一个缺点是不同 catalog 实例的子类型没有共同的父类。这是否重要取决于您的设计。

由于您的示例中没有任何成员函数,很难确定继承是否有意义。 library 可以包含一个 catalog<book> 成员,或者您可以使用 catalog<book> 作为它本身,而不需要单独的 library 类。


谢谢您的建议。我想避免将item*强制转换为book*,但我承认这主要是出于美学原因。我认为我最终会更深入地使用模板,并同时使用template<class T> class itemtemplate<class T> class catalog。如果我解决了细节问题,我会发布一个答案。 - Stephen Powell
如果library确保向量中只存在book,那么static_cast就足够了。 - eerorika

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接