继承类的继承集合

Inherited collection of inherited class

本文关键字:继承 集合      更新时间:2023-10-16

我目前有两个类: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
}

(我认为如果itemsvector<item>,那就没有什么区别了。)item的一些初始化,比如填充列表related_items,需要完整的item,所以是在catalog构造函数中完成的。

现在我想定义新的类:book,它表示item的特定类型,library,它是保存books的catalog的类型。我希望library构造函数为一定数量的books分配内存,然后以与catalog完全相同的方式初始化从item继承的book的那些成员。然后,它将对book的其余成员进行一些进一步的初始化。

我最初的想法是使这些派生类分别为itemcatalog。但就目前情况来看,library不可能是catalog的派生类,因为catalog有一个指向基类对象数组的指针。实现这种结构的"最佳"方式是什么?

如果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>成员,也可以在不使用单独的library类的情况下原样使用catalog<book>