继承和动态绑定与数据抽象一起成为面向对象编程的基础。
模板使我们能够编写独立于具体类型的泛型类和泛型函数。
第15章 面向对象编程
面向对象编程基于三个基本概念:数据抽象、继承和动态绑定。在C++中,用类进行数据抽象,用派生类从一个类继承另一个类:派生类继承基类的成员。动态绑定使编译器能够在运行时决定是使用基类中定义的函数还是派生类中定义的函数。
继承和动态绑定在两个方面简化了我们的程序:能够容易地定义与其他类相似但又不相同的新类,能够更容易地编写忽略这些相似类型之间区别的程序。
纯虚函数:纯虚函数是一种特殊的虚函数,在许多情况下,在基类中不能对虚函数给出有意义的实现,而把它声明为纯虚函数,它的实现留给该基类的派生类去做。这就是纯虚函数的作用。在函数形参表后面写上 =0 以指定纯虚函数。
含有(或继承)一个或多个纯虚函数的类抽象基类,除了作为抽象基类的派生类的对象的组成部分,不能创建抽象类型的对象。
将派生类对象复制到基类对象时,派生类对象将被切掉。
C++中面向对象编程的一个颇具讽刺意味的地方是,不能使用对象支持面向对象编程,相反,必须使用指针或引用。
C++中可以通过定义句柄类来存储和管理基类指针。
因为派生类对象包含基类部分,所以可以将派生类型的引用或指针转换为基类类型的引用或指针。
第16章 模板与泛型编程
所谓泛型编程就是以独立于任何特定类型的方式编写代码。
函数模板是一个独立于类型的函数,可作为一种方式,产生函数的特定类型版本。
模板定义以关键字 template 开始,后接模板形参表,模板形参表是用尖括号括住的一个或多个模板形参的列表,形参之间以逗号分隔。例如:
template <typename T>
int compare(const T &v1, const T &v2)
{
if (v1<v2) return -1;
if (v2<v1) return 1;
}
可以给模板形参赋予的唯一含义是区别形参是类型新参还是非类型形参。如果是类型形参,我们就知道该形参表示 未知类型,如果是非类型形参,我们就知道它是一个 未知值。
类模板成员函数的定义具有如下形式:
1、必须以关键字 template 开头,后接类的模板形参表。
2、必须指出它是哪个类的成员。
3、类名必须包含其模板形参。
形式如下:
template <class T> ret-type Queue<T>::member-name
类模板的指针定义不会对类进行实例化,只有用到这样的指针时才会对类进行实例化。
非类型模板实参必须是编译时常量表达式,不能用变量作模板实参。