何时使用模板与继承

When to use template vs inheritance

本文关键字:继承 何时使      更新时间:2023-10-16

我一直在寻找这个,对此的常见反应似乎是"它们是不相关的,一个不能代替另一个"。但是假设你在面试中被问到"什么时候你会使用模板而不是继承,反之亦然?"

我认为模板和继承实际上是正交的概念:继承是"垂直的",从抽象到越来越具体。形状,三角形,等边三角形

另一方面,

模板是"水平的",定义了并行的代码实例,它们彼此不知道。整数排序在形式上与双精度排序和字符串排序相同,但这是三个完全不同的函数。从远处看,他们都是一样的,但他们彼此之间没有任何关系。

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

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

"共同回应"是错误的。在"Effective c++"中,Scott Meyers在项目41中说:

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

Meyers继续总结:

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

当您希望保持类型安全或希望避免虚拟分派时,请在基类(或组合)中使用模板。

当定义工作在多种不相关对象上的接口时,模板是合适的。模板对于容器类来说非常有意义,因为它有必要泛化容器中的对象,同时保留类型信息。

在继承的情况下,所有参数必须是定义的参数类型,或从它扩展。因此,当方法对具有直接层次关系的对象进行操作时,继承是最佳选择。

当继承不正确地应用时,则需要创建不相关对象的过于复杂的类层次结构。代码的复杂性将会小幅增加。如果是这种情况,那么使用模板。

Template描述了一种算法,如确定类的两个对象之间比较的结果或对它们进行排序。被操作对象的类型(类)不同,但操作或逻辑或步骤等在逻辑上是相同的。

另一方面,子类使用

继承仅用于扩展或使父类功能更具体。希望你能理解