我需要理解的是,在C++中是否真的不需要Inheritance & virtual functions,一个人可以使用Generic programming实现所有的功能。这是来自Alexander Stepanov的演讲,我看的是Alexander Stepanov: STL and Its Design Principles
发布于 2011-11-04 21:25:32
我总是喜欢把模板和继承看作两个正交的概念,从字面上看:对我来说,继承是“垂直的”,从顶部的基类开始,然后“向下”到越来越多的派生类。每个(公开的)派生类在其接口方面都是一个基类:贵宾狗是狗是动物。
另一方面,模板变得“水平”:模板的每个实例都有相同的正式代码内容,但两个不同的实例是完全独立的、不相关的部分,它们“并行”运行,彼此看不到对方。对整数数组进行排序在形式上与对浮点数数组进行排序是相同的,但是整数数组与浮点数组完全没有关系。
由于这两个概念是完全正交的,因此它们的应用也是如此。当然,您可以设计一种情况,在这种情况下,您可以用另一种方式来替换,但如果使用惯用法,模板(泛型)编程和继承(多态)编程都是独立的技术,两者都有自己的位置。
继承是通过添加细节使抽象的概念变得越来越具体。泛型编程本质上是代码生成。
作为我最喜欢的例子,让我在一个流行的类型擦除实现中提到这两种技术是如何完美地结合在一起的:单个处理程序类持有抽象容器类的私有多态指针基类,而具体的派生容器类被确定为模板化的类型推导构造函数。我们使用模板代码生成来创建任意的派生类系列:
// internal helper base
class TEBase { /* ... */ };
// internal helper derived TEMPLATE class (unbounded family!)
template <typename T> class TEImpl : public TEBase { /* ... */ }
// single public interface class
class TE
{
TEBase * impl;
public:
// "infinitely many" constructors:
template <typename T> TE(const T & x) : impl(new TEImpl<T>(x)) { }
// ...
};发布于 2011-11-04 21:13:47
它们服务于不同的目的。泛型编程(至少在C++中)是关于编译时多态的,虚函数是关于运行时多态的。
如果具体类型的选择取决于用户的输入,那么您确实需要运行时多态-模板不会对您有所帮助。
发布于 2011-11-04 21:10:07
多态性(即动态绑定)对于基于运行时数据的决策至关重要。泛型数据结构很棒,但它们是有限的。
示例:考虑离散事件模拟器的事件处理程序:使用纯虚拟函数实现它非常便宜(就编程工作量而言),但如果纯粹使用模板化的类来实现,则是冗长且相当不灵活的。
经验法则:如果您发现自己切换(或if-else-ing)某个输入对象的值,并根据其值执行不同的操作,则可能存在一个更好的(在可维护性方面)动态绑定解决方案。
不久前,我想到了一个类似的问题,我只能梦想着能给你一个如此棒的答案。这也许是有帮助的:interface paradigm performance (dynamic binding vs. generic programming)
https://stackoverflow.com/questions/8009475
复制相似问题