模板类与抽象类

Posted

技术标签:

【中文标题】模板类与抽象类【英文标题】:Template class vs Abstract class 【发布时间】:2015-09-04 07:03:19 【问题描述】:

所以我开始回顾我的一些 OOP 课程,发现了一个问题:模板类和抽象类有什么区别?什么时候应该使用一个而不是另一个?

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

【问题讨论】:

【参考方案1】:

它们都是 C++ 提供的用于更改应用程序部分的实现和/或行为(即可扩展性和重用)的工具。

主要区别在于抽象类(运行时多态性)是一种运行时机制,而模板是一种编译时机制。这意味着通过使用抽象类,您可以在运行时更改行为(例如,通过在运行时加载配置文件,或通过插件)。相反,使用模板,您可以在编译时绑定您的实现(即,开发人员一劳永逸地静态决定所有行为)。

作为一种运行时机制,抽象类由于虚函数而带来运行时开销。模板不会遇到这个问题。

另一方面,目前(C++14 标准)您无法为类模板指定接口(即,您没有可以绑定到模板的类规范,并且如果您尝试实例化一个模板类绑定了错误的类,你会得到难以理解的编译器错误)。相反,抽象类实际上是您可以使用的具体类的“规范”。

【讨论】:

嗯,编译器错误可以理解,但是需要一些勇气和经验才能将它们分开(而不是绝望地举起手来)。提示:将编译器输出保存到文件中,并在正确的位置随意添加换行符。您将很快了解模板错误的结构,并且使用换行符可以更轻松地找出类型不匹配的确切位置。 @DevSolar 是的,对。我只是长话短说 :-) 当标准添加 concepts 时,这个问题就会消失......

以上是关于模板类与抽象类的主要内容,如果未能解决你的问题,请参考以下文章

抽象类与接口的区别

行为型模式-模板方法模式

Java抽象类与接口的区别

Java抽象类与接口的区别

Java抽象类与接口的区别

抽象类与接口