继承和虚函数与通用编程

Avi*_*ash 14 c++ stl generic-programming

我需要了解Inheritance & virtual functions在C++ 中是否真的没有必要,并且可以实现一切使用Generic programming.这是来自Alexander Stepanov我正在观看的讲座是Alexander Stepanov:STL及其设计原则

Nem*_*vic 15

他们有不同的目的.通用编程(至少在C++中)是关于编译时多态,以及关于运行时多态性的虚函数.

如果具体类型的选择取决于用户的输入,那么你真的需要运行时多态性 - 模板对你没有帮助.


Ker*_* SB 14

我总是喜欢将模板和继承视为两个正交概念,从字面意义上讲:对我来说,继承是"垂直的",从顶部的基类开始,然后"向下"到越来越多的派生类.每个(公开)派生类就其界面而言基类:狮子狗是狗是动物.

另一方面,模板是"水平的":模板的每个实例都具有相同的正式代码内容,但是两个不同的实例是完全独立的,不相关的部分,它们以"并行"方式运行而不会相互看到.排序整数数组与排序浮点数组正式相同,但整数数组与浮点数组完全无关.

由于这两个概念完全正交,因此它们的应用也是如此.当然,你可以设想你可以相互替换的情况,但是当习惯性地完成时,模板(通用)编程和继承(多态)编程都是独立的技术,它们都有它们的位置.

继承是通过添加细节使抽象概念变得越来越具体.通用编程本质上是代码生成.

作为我最喜欢的例子,让我提一下两种技术如何在流行的类型擦除实现中精美地结合在一起:单个处理程序类包含一个抽象容器类的私有多态指针到基础,而具体的派生容器类是确定了模板化的类型推导构造函数.我们使用模板代码生成来创建任意派生类系列:

// 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)) { }
  // ...
};
Run Code Online (Sandbox Code Playgroud)