何时使用模板与继承
When to use template vs inheritance
我一直在寻找这个,对此的常见反应似乎是"它们是不相关的,一个不能代替另一个"。但是假设你在面试中被问到"什么时候你会使用模板而不是继承,反之亦然?"
我认为模板和继承实际上是正交的概念:继承是"垂直的",从抽象到越来越具体。形状,三角形,等边三角形
另一方面,模板是"水平的",定义了并行的代码实例,它们彼此不知道。整数排序在形式上与双精度排序和字符串排序相同,但这是三个完全不同的函数。从远处看,他们都是一样的,但他们彼此之间没有任何关系。
继承提供了运行时抽象。模板是代码生成工具。
因为这些概念是正交的,它们可以很高兴地一起使用以实现共同的目标。我最喜欢的例子是类型擦除,其中类型擦除容器包含一个指向实现类的虚基指针,但是有许多由模板派生类生成的具体实现。模板代码生成用于填充继承层次结构。魔法。
"共同回应"是错误的。在"Effective c++"中,Scott Meyers在项目41中说:
第41项:理解隐式接口和编译时多态性
Meyers继续总结:
- 类和模板都支持接口和多态。
- 对于类,接口是显式的,并且以功能为中心签名。多态性通过虚函数在运行时发生。
- 对于模板参数,接口是隐式的,基于valid表达式。多态发生在通过模板编译期间实例化和函数重载解析。
当您希望保持类型安全或希望避免虚拟分派时,请在基类(或组合)中使用模板。
当定义工作在多种不相关对象上的接口时,模板是合适的。模板对于容器类来说非常有意义,因为它有必要泛化容器中的对象,同时保留类型信息。
在继承的情况下,所有参数必须是定义的参数类型,或从它扩展。因此,当方法对具有直接层次关系的对象进行操作时,继承是最佳选择。
当继承不正确地应用时,则需要创建不相关对象的过于复杂的类层次结构。代码的复杂性将会小幅增加。如果是这种情况,那么使用模板。
Template描述了一种算法,如确定类的两个对象之间比较的结果或对它们进行排序。被操作对象的类型(类)不同,但操作或逻辑或步骤等在逻辑上是相同的。
另一方面,子类使用继承仅用于扩展或使父类功能更具体。希望你能理解
- 为什么C++需要公共继承,忽略朋友声明,才能使动态向下工作?
- 何时使函数成为类成员函数C++?
- 何时必须使操作员<<过载?
- 如何使模板化类保留继承?
- 使从一个基类派生的类能够使用继承的受保护成员
- 涉及继承,指针对象的交易以及何时进行的问题
- 模板类的专门继承使成员函数返回模板类型,而不是继承的类类型
- 如何使继承的类与父类仅在C++中的一个值不同
- 在Windows上,何时有必要将附加到目录路径上,以使_stat成功
- 如何使用模板或继承使以下代码工作
- 如何使C 继承保护访问说明器
- 如何使继承相同基类的类的虚拟方法弄清楚如何处理它们的参数?
- 使代码变小以进行多重继承
- 继承,使基本成员变量const
- 使初始化列表与 C++ 中的继承一起使用
- 在继承层次结构中将方法定义为虚拟方法一次,以使多态性发挥作用
- 如何使数组包含从基类继承的类
- 是否可以从模板基类继承,但不能使派生类也成为模板
- 使子结构继承初始化
- opencv函数的继承是否使我的程序变得更好