【问题标题】:Are there pros to inheriting a class template?继承类模板有优点吗?
【发布时间】:2017-01-15 17:26:31
【问题描述】:

我是 C++ 新手,我的“设计”问题比实际代码更多:

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

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

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

重点是,从类模板继承而不是仅仅在类中创建模板的新对象有什么好处(它本身不是通用的)?

【问题讨论】:

    标签: c++ templates inheritance graph


    【解决方案1】:

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

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

    话虽如此,在很多情况下,可能需要继承模板类,并根据手头的任务将其保留为通用类或特定类。例如,如果您的任务是创建一个表示整数列表的类,该列表具有对列表的常规操作,并且除了实现返回的函数(假设这些数字的平均值或任何其他不受支持的操作由原始的泛型类列表)。在这种情况下,您继承 Class List 并添加您的方法。

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

    【讨论】:

    • 首先,感谢您的回答。我将进一步解释:每个继承模板的图都有几个独特的功能(它接收输入的方式、执行 BFS 或拓扑排序等)。并非所有的图表都有相同的功能,但都需要在 Graphs 中实现一些基本功能。
    • 在这种情况下,我建议继承通用类,指定权重和边的类型,并添加特定于每个特定图形的附加函数。这就是继承的目的:为原始类的更具体类型添加特定功能。现在至于是否保持通用性取决于您的需求,但根据您的初始解释,您应该使其具体化,因为每个“特殊”图都有特定的权重和边。
    【解决方案2】:

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

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

    2. 向派生类的用户公开public 方法/字段:如果您想“传播”所有基类的public 方法/fields 到派生的,继承会自动为您完成。如果使用合成,则必须手动公开它们。

    【讨论】:

    • 首先,感谢您的回答。我将进一步解释:每个继承模板的图都有几个独特的功能(它接收输入的方式、执行 BFS 或拓扑排序等)。并不是所有的图都具有相同的功能,但它们都需要在 Graphs 中实现一些基本功能。我认为访问受保护的字段值得在我的情况下使用继承,我宁愿不为每个方法编写 get 或 set。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-23
    • 2018-01-18
    • 2011-03-22
    • 2012-10-05
    • 1970-01-01
    相关资源
    最近更新 更多