模板类 vs 抽象类

6

我开始回顾我的面向对象编程课程,发现有这样一个问题:什么是模板类和抽象类的区别?在什么情况下应该使用其中之一而不是另一个?

我知道模板类的实例化方式与函数相同。使用实际数据类型替换模板参数并创建副本。抽象类具有纯虚函数,不能被实例化。派生类必须定义虚函数。

1个回答

7
他们都是 C++ 提供的工具,用于改变应用程序的实现和/或行为(即可扩展性和重用)。
主要区别在于抽象类(运行时多态性)是一种“运行时”机制,而模板是一种“编译时”机制。这意味着使用抽象类可以在运行时可能更改行为(例如通过在运行时加载配置文件或使用插件)。相反,使用模板则将实现绑定到编译时(即开发人员在静态条件下决定一次性行为)。
作为一种运行时机制,由于虚函数的存在,抽象类会带来运行时开销。而模板不受此影响。
另一方面,在当前的 C++14 标准中,您无法为类模板指定接口(即您没有可以绑定到模板的类的规范,如果尝试实例化绑定错误的类模板,则会收到难以理解的编译器错误)。相反,抽象类实际上是您可以使用的具体类的“规范”。

编译器错误*是可以理解的,但需要一些勇气和经验来分析它们(而不是只是绝望地放弃)。提示:将编译器输出保存到文件中,并在正确的位置自由添加换行符。您将很快学会模板错误的结构,并且通过换行符,找出类型不匹配的确切位置变得更容易了。 - DevSolar
@DevSolar 是的,没错。我只是在简化一个长故事 :-) 当标准添加概念时,这个问题就会消失... - Daniele Pallastrelli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接