c++ - 继承基于模板的数据结构有什么好处?

标签 c++ templates inheritance

<分区>

下面我将进入正题并进行解释。

如果有的话,...的好处是什么

template<class T>
class myStack : public myList<T>...// my stack

结束

template<class T, Container = deque<T> >
class stack...// C++ stack

最近我在编写一些代码时遇到了一个继承问题,在这个问题中我暴露了基类的一些我不想暴露的方面。具体的例子并不重要,所以我会把它与几个学期前联系起来,当时我参加了一个数据结构类(class),我们在类(class)中实现了自己的列表、堆栈、队列等。

在这个类中,我们要设计一个从列表继承的堆栈。这样做的问题是我公开了可能会破坏堆栈完整性的基础的公共(public)方法。可能是因为我有点纯粹主义者,但是让 insert()remove() 散落在堆栈中对我来说很麻烦。当时我没有时间去研究它,但这次我想我会引用 C++ 标准,看看那里是如何定义 stack 的。瞧,我找到了上面的代码;这是一个明显的解决方案,但我忽略了。

这是我的观点......

C++ 实现“更好”,因为它允许用户根据需要自由选择底层结构,并维护一个更纯粹的堆栈,因为它清楚地表明只有堆栈功能对用户可用,并且可以更好地防止意外损坏.设计选择背后是否有更实质性的、非主观的推理,或者继承了其中的缺陷?

我的明显好处是代码重用,这与类(class)相同,我不认为这是额外的好处,因为我个人认为 C++ 实现的自由带来的好处。不过,我确实将基类的过度曝光(我的话)视为一个骗局。设计选择背后是否有更实质性的、非主观的推理,或者继承了其中的缺陷?

同样,我不关心语言,我更关心权衡我自己设计的利弊。

最佳答案

C++ 集合和 Java 集合非常不同。 Java 集合具有明显的类型层次结构,而大多数 C++ 集合类型不扩展任何其他类,模板广泛用于支持多种集合类型。

虽然我不确定,但我认为 Java 库开发人员将 Stack 设为 Vector 的子类,因为堆栈是按明确定义的顺序排列的元素集合,因此其行为类似于列表,并且通过对 Vector 进行子类化,它们可以免费获得堆栈的大部分实现。这还有一个好处,您可以在需要列表或 vector 的地方使用堆栈,例如,您可以将堆栈传递给接受列表并对其进行迭代的函数。当然,C++ 堆栈是不可迭代的,因此这两个堆栈之间存在(有意或无意)非常不同的语义。

最后,对于您自己的代码,如果您正在考虑 B 是否应该继承或包含 A,首先问问自己 B 是否是 A,或者更具体地说,您是否愿意通过传递 B 将其视为 A到需要 A 的函数,或从需要返回 A 的函数返回它。如果是这样,您应该使用继承,否则您可能应该使用组合。

关于c++ - 继承基于模板的数据结构有什么好处?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20714261/

相关文章:

jquery - 使用 Twitter Bootstrap 进行基于网格和堆栈的布局

templates - 如果模板为真,如何使模板函数为常量

python - 如何使用 'mother' 中继承的 'child class' 类的函数?

c++ - 通过传递 const char* 隐式选择字符串模板

c++ - 快速排序不起作用(段错误)

c++ - 将文件、函数、行添加到全局 boost 记录器

c++ - 在构造函数中调用纯虚函数会报错

c++ - 如何确定作业的两个副作用是否未排序?

c++ - 每当成员变量可以由可变参数构造时,有条件地启用构造函数

java - 在子接口(interface)中声明具有相同声明的通用方法的体系结构重要性是什么