作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我需要了解在 C++ 中是否真的不需要继承和虚函数
,并且可以使用通用编程
来实现一切。这来自 Alexander Stepanov
,我正在观看的讲座是 Alexander Stepanov: STL and Its Design Principles
最佳答案
我总是喜欢将模板和继承视为两个正交概念,从字面意义上说:对我来说,继承是“垂直”的,从顶部的基类开始,然后“向下”到越来越多的派生类。每个(公共(public))派生类是在其接口(interface)方面的基类: Poodle 是狗是动物。
另一方面,模板是“水平的”:模板的每个实例都有相同的正式代码内容,但两个不同的实例是完全独立的、不相关的部分以“平行”方式运行并且看不到对方。对整数数组进行排序在形式上与对 float 数组进行排序相同,但整数数组与 float 数组完全没有关系。
由于这两个概念是完全正交的,因此它们的应用也是如此。当然,您可以设计一种可以互相替换的情况,但是如果按照惯用方式完成,模板(泛型)编程和继承(多态)编程都是独立的技术,它们都有自己的位置。
继承是通过添加细节使抽象概念越来越具体。泛型编程本质上是代码生成。
作为我最喜欢的例子,让我提一下这两种技术是如何在一个流行的类型删除实现中完美结合的:单个处理程序类拥有一个私有(private)多态指针,指向抽象容器的基类类和具体的派生容器类被确定为模板化类型推导构造函数。我们使用模板代码生成来创建任意系列的派生类:
// 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)) { }
// ...
};
关于c++ - 继承和虚函数与泛型编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8009475/
我是一名优秀的程序员,十分优秀!