继承类的继承集合

时间:2015-04-16 08:59:39

标签: c++ inheritance

我目前有两个课程: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的一些初始化,就像填充列表{{ 1}},需要完整的related_items s,所以在item构造函数中完成。

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

我最初的想法是分别制作itemcatalog的派生类。但就目前而言,library不能成为catalog的派生类,因为catalog具有指向基类对象数组的指针。什么是最好的&#34;实现这种结构的方式?

1 个答案:

答案 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类。