是否有继承类模板的优点?

时间:2017-01-15 17:26:32

标签: c++ templates inheritance graph

我是c +的新手,我的问题比实际代码更多:

我想编写一个可以处理许多不同类型图形的程序,但是我想支持任何类型的顶点或权重(即顶点是字符串或字符,重量可以是int,double或char或者甚至是一堂课)。

为此我编写了一个图形的类模板,其中包含一组顶点和一个带有边和它们的权重和get / set函数的映射 - 然后我有其他类,如有限状态机图,从类模板“Graphs”继承的常规加权图等。 (在每个图中,我确切知道顶点和权重的类型)

我这样做是因为扩展基类并从中继承它似乎很自然。它到目前为止工作,但后来我想到了什么意思?我可以在每个类中简单地创建这些通用图形中的一个并使用它,因为我将使用来自STL的ADT。

关键是,继承类模板是否有任何好处,而不仅仅是在类中创建模板的新对象(它本身不是通用的)?

2 个答案:

答案 0 :(得分:2)

您的问题非常广泛,在很大程度上取决于您的具体情况。无论如何,假设您的问题可以简化为:&#34;为什么我可以在将对象放入类中时使用继承?&#34; ,这里有两个客观原因:< / p>

  1. 空基础优化:如果您的基类X为空(即sizeof(X) == 0,则将其存储为你的派生类的字段会浪费一些内存,因为标准强制每个字段都有自己的地址。使用继承将阻止这种情况。 More information here.

  2. public个方法/字段公开给派生类的用户:如果您希望&#34;传播&#34; 所有您的基类的public方法/字段到派生的方法/字段,继承将自动为您执行。如果使用合成,则必须手动公开它们。

答案 1 :(得分:2)

根据您上面给出的解释,继承通用图表是不正确的。继承是一种工具,可帮助将具有其他属性,方法和功能的相同类型的现有类扩展为一个类。

所以,如果您要做的就是通过指定边和权重的类型来获取通用图并使其成为特定图,而不向原始类的结构或功能添加任何其他内容,那么继承就是不必要的。

话虽如此,有很多情况下,人们可能需要继承模板类,并根据手头的任务将其保留为通用模板类或特定模板类。例如,如果您被赋予创建一个类的任务,该类表示列表上的常规操作的整数列表,另外还要实现一个返回的函数(让我们说这些数字的平均值或任何其他操作原始通用类List不支持。在这种情况下,您将继承类列表并添加方法。

同样,您可以将List保留为模板类,并添加所需的功能,如果这是任务所需的。