我目前有两个类:item和catalog;后者包含一个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,它是一种保存代码的catalog类型。我希望library构造函数为一定数量的代码分配内存,然后初始化那些从item继承的book成员,方法与<代码>d19book>完全相同。然后,它将对book的其余成员进行一些进一步的初始化。
我最初的想法是让这些派生类分别由item和catalog组成。但就目前而言,library不能是catalog的派生类,因为catalog有一个指向基类的对象数组的指针。实现这种结构的“最佳”方式是什么?
发布于 2015-04-16 17:16:34
如果catalog包含一个指针数组,比方说std::vector<std::unique_ptr<item>>,那么它可以包含item的任何子类型。继承catalog的library可以让成员函数只接受books (继承自item),并且它可以在返回对书籍的引用(或您想要对它们做的任何事情)时适当地强制转换指针。
另一种选择是模板:
template<class T>
class catalog {
std::vector<T> items;
};
class library: public catalog<book> {
// ...
};模板的一个缺点是不同catalog实例的子类型没有共同的父类。这是否重要取决于您的设计。
由于您的示例中没有任何成员函数,因此很难判断继承是否有任何意义。library可以包含一个catalog<book>成员,或者您可以按原样使用catalog<book>,但不需要单独的library类。
https://stackoverflow.com/questions/29669941
复制相似问题