我目前有两个课程: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
的一些初始化,就像填充列表{{ 1}},需要完整的related_items
s,所以在item
构造函数中完成。
现在我想定义新的类:catalog
,它代表特定类型的book
,item
,是library
的类型,代表catalog
{1}}秒。我希望book
构造函数为一定数量的library
分配内存,然后初始化从book
继承的book
成员,其方式与item
完全相同。 catalog
。然后,它将对book
的剩余成员进行进一步初始化。
我最初的想法是分别制作item
和catalog
的派生类。但就目前而言,library
不能成为catalog
的派生类,因为catalog
具有指向基类对象数组的指针。什么是最好的&#34;实现这种结构的方式?
答案 0 :(得分:2)
如果catalog
包含指针数组,请说std::vector<std::unique_ptr<item>>
它可以保存item
的任何子类型。 library
继承catalog
的成员函数只能接受book
s(继承自item
),它可以在返回对书籍的引用时适当地转换指针(或者,等等)你想和他们一起做。)
另一种选择是模板:
template<class T>
class catalog {
std::vector<T> items;
};
class library: public catalog<book> {
// ...
};
模板的一个缺点是不同catalog
个实例的子类型没有共同的父级。这是否重要取决于您的设计。
由于您的示例中没有任何成员函数,因此很难判断继承是否有任何意义。 library
可能包含catalog<book>
成员,或者您可以使用catalog<book>
,因为它没有单独的library
类。