从模板类的实例继承

时间:2011-12-05 17:33:26

标签: c++

这里的简单问题。我必须定义包含书籍,电影,CD的类。我用所有常用方法定义了一个模板类,比如说Set<T>,然后定义了从Set

的特定实例派生的类(它是正确的术语吗?)
class Movies_set : public Set<Movie>
{
    /* ... */
}

其中我定义了一些其他方法(比如搜索actor的函数)。这是一种很好的编程技术还是有更方便的方法?

4 个答案:

答案 0 :(得分:3)

这取决于Set究竟是什么。我怀疑Set是类似于std :: set的东西,在这种情况下,我建议不要推导并引导你走向作曲。

从Set派生的原因是一个坏主意,因为它暴露了set的API,它与MovieSet无关。如果您需要对MovieSet对象进行搜索的方法,请在MovieSet本身上实现它们,特别是因为正如您所指出的那样,您将增加MovieSet的界面。

通过这种方式,您还可以获得非常强大的功能:封装。如果由于某种原因您决定从Set更改为std :: map,则基类的接口可能会更改,并且访问MovieSet的任何代码都将受到影响。如果您已将Set存储为私有数据成员,则不会遇到此问题,因为您已经定义了MovieSet的相应访问者。

当然,如果基于我的前提,Set实际上只是一个容器。

答案 1 :(得分:0)

这样做绝对没有错,这是一个很常见的习语。也就是说,您可能希望确保typedef足够了。如果您的Movies_set没有添加新的特定功能,那么最好:

typedef Set<Movie> Movies_Set;

显然,如果Movies_set引入了与电影相关的特定功能,那么继承是最佳选择。

答案 2 :(得分:0)

这绝对没问题。

实际上,有一个众所周知的模式几乎完全相似,只是它使用派生类本身作为基类模板的类型参数:

答案 3 :(得分:0)

如果Movie_set没有添加任何Set的实现,那么从Set

派生的时间就浪费了

你最好输入它。

typedef Set<Movie> movie_set;
像那样。但是,如果你专门使用新的成员函数和数据成员进行进一步设置,那么这是好的,尽管从容器派生并不常见(通常你拥有它们)。但是,只要必要的功能是虚拟(析构函数),它应该没问题。