首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >继承类的继承集合

继承类的继承集合
EN

Stack Overflow用户
提问于 2015-04-16 16:59:39
回答 1查看 74关注 0票数 3

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

代码语言:javascript
复制
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的其余成员进行一些进一步的初始化。

我最初的想法是让这些派生类分别由itemcatalog组成。但就目前而言,library不能是catalog的派生类,因为catalog有一个指向基类的对象数组的指针。实现这种结构的“最佳”方式是什么?

EN

回答 1

Stack Overflow用户

发布于 2015-04-16 17:16:34

如果catalog包含一个指针数组,比方说std::vector<std::unique_ptr<item>>,那么它可以包含item的任何子类型。继承cataloglibrary可以让成员函数只接受books (继承自item),并且它可以在返回对书籍的引用(或您想要对它们做的任何事情)时适当地强制转换指针。

另一种选择是模板:

代码语言:javascript
复制
template<class T>
class catalog {
    std::vector<T> items;
};

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

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

由于您的示例中没有任何成员函数,因此很难判断继承是否有任何意义。library可以包含一个catalog<book>成员,或者您可以按原样使用catalog<book>,但不需要单独的library类。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29669941

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档