何时使用模板与继承

Bre*_*212 34 c++ inheritance templates

我一直在四处寻找这一个,而这个共同的反应似乎是沿着线"他们是不相关的,而一个不能代替其他".但是你说你正在接受采访并被问到"你何时会使用模板而不是继承,反之亦然?"

Ker*_* SB 63

我看待它的方式是模板和继承是字面上的正交概念:继承是"垂直的"并且从抽象到越来越具体.形状,三角形,等边三角形.

另一方面,模板是"水平的",并定义了彼此不知道的代码的并行实例.排序整数与排序双精度和排序字符串正式相同,但这些是三个完全不同的函数.他们从远处"看起来"都一样,但他们彼此无关.

继承提供运行时抽象.模板是代码生成工具.

因为这些概念是正交的,所以它们可以愉快地一起用于实现共同目标.我最喜欢的例子是类型擦除,其中类型擦除容器包含指向实现类的虚拟基指针,但是模板派生类生成了任意多个具体实现.模板代码生成用于填充继承层次结构.魔法.

  • 我喜欢这个解释。它比其他人用简单的英语多一点。 (2认同)
  • @pistacchio:我不会将复杂继承称为“解决方案”。模板以一种更好的方式提供可排序性,因为被排序者不需要知道它正在被排序。复杂的继承通常会在您以一种强迫思维方式工作时产生,即一切都必须是继承层次结构,这实际上很少合适。Go 的方法很简单,但限制更多,效率更低。它适合 Go 想要成为的小语言。 (2认同)

Gna*_*wme 19

"共同反应"是错误的.在"有效的C++"中,Scott Meyers在第41项中说:

第41项:理解隐式接口和编译时多态.

迈耶斯继续总结:

  • 类和模板都支持接口和多态.
  • 对于类,接口是显式的并且以函数签名为中心.多态性在运行时通过虚函数发生.
  • 对于模板参数,接口是隐式的并且基于有效表达式.通过模板实例化和函数重载分辨率在编译期间发生多态性.

  • 在《Effective C++》第一版中,最相关的部分是第 42 条:“继承和模板之间的区别”。该书第 41 条是“明智地使用私有继承”。只是向拥有该版本的任何人提及这一点。 (2认同)
  • 这解释了它们是什么,但不能帮助您决定使用哪一个. (2认同)
  • @MK。它至少告诉您,如果您需要动态多态性,则需要虚拟方法,而如果您只需要静态多态性(为了使编码更容易并编写通用代码而不是处理通用输入),那么模板/概念也是一种选择。 (2认同)

jus*_*tin 4

当您想要保留类型安全或想要避免虚拟调度时,请在基础(或组合)中使用模板。

  • 事实上,我怀疑面试官正在寻找避免通过 [CRTP](http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern) 进行虚拟调度。 (4认同)