C++提供了集中重用代码的手段。第13章介绍的共有继承能够建立is-a关系,这样派生类可以重用基类的代码。私有继承和保护继承也使得能够重用基类的代码,单建立的是has-a关系。使用私有继承时,积累的公有成员和保护成员将称为派生类的私有成员;使用保护继承时,积累的公有成员和保护成员将称为派生类的保护成员。无论使用哪种继承,基类的共有接口都将称为派生类的内部接口。这有时候被称为继承实现,但并不继承接口,因为派生类对象不能显式地使用基类的接口。因此,不能将派生类对象看作是一种基类对象。由于这种原因,在不进行显式类型转换的情况下,基类指针或引用将不能指向派生了对象。
还可以通过开发包含对象成员的类来重用类代码。这种发哪个发被称为包含、层次化或组合,它建立的也是has-a关系。与私有继承和保护继承相比,包含更容易实现和使用,所以有限采用这种方式。然而,私有继承和保护及成比包含有一些不同的功能。例如,继承允许派生类访问基类的保护成员;还允许派生类重新定义从基类那里继承的虚函数。因为包含不是继承,所以通过包含来重用类代码时,不能使用这些功能。另一方面,如果需要使用某个类的几个对象,则用包含更适合。例如,State类可以包含一组Country对象。
多重继承(MI)使得能后在类设计中重用多个类的代码。私有MI或保护MI建立has-a关系,而共有MI建立is-a关系。MI会带来一些问题,即多次定义同一个名称,继承多个基类对象。可以使用类限定符来解决名称二义性的问题,使用虚基类来避免继承多个基类对象的问题。单使用虚基类后,就需要为编写构造函数初始化列表以及解决二义性问题引入新的规则。
类模板使得能够创建通用的类设计,其中类型(通常是成员类型)由类型参数表示。典型的模板如下:
template <class T
class Ic
{
    T v;
    ...
public:
    Ic(const T & val) : v(val) { }
    ...
};
其中,T是类型参数,用作以后将指定的实际类型的占位符(这个参数可以是任意有效的C++名称,单通常使用T和Type)。在这种环境下,也可以使用typename代替class:
template <typename T>    // same as template <class T>
class Rev {...} ;
类定义(实例化)在声明类对象并指定特定类型时生成。例如,下面的声明导致编译器生成类声明,用声明中的实际类型short替换模板中的所有类型参数T:
class Ic<short> sic;    // implicit instantiation
这里,类名为Ic<short>,而不是Ic。Ic<short>称为模板具体化。具体地说,这是一个隐式实例化。
使用关键字template声明类的特定具体化时,将发生显式实例化:
template class Ic<int>;    // explicit instantiation
在这种情况下,编译器将使用通用模板生成一个int具体化——Ic<int>,虽然尚未请求者个类的对象。
可以提供显式具体化——覆盖模板定一个具体类声明。方法是以template<>打头,然后是模板类名称,再加上尖括号(其中包含要具体化的类型)。例如,为字符指针提供专用Ic类的代码如下:
template <> class Ic<char *>
{
    char * str;
    ...
public:
    Ic(const char * s) : str(s) { }
    ...
};
这样,下面这样的声明将为chic使用专用定义,而不是通用模板:
class Ic<char *> chic;
类模板可以指定多个泛型,也可以有非类型参数:
template <class T, class TT, int n>
class Pals {...};
下面的声明将生成一个隐式实例化,用double代替T,用string代替TT,用6代替n:
Pals<double, string, 6> mix;
类模板还可以包含本身就是模板的参数:
template < template <typename T> class Cl, typename U, int z >
class Trophy {...};
其中z是一个int值,U为类型名,CL为一个使用template<typename, T>声明的类模板。
类模板可以被部分具体化:
template <class T> Pals<T, T, 10> { ... };
template <class T, class TT> Pals<T, TT, 100> { ... };
template <class T, int n> Pals <T, T*, n> { ... };
第一个声明为两个类型相同,且n的值为6的情况创建了一个具体化。同样,第二个声明为n等于100的情况创建一个具体化;第三个声明为第二个类型是指向第一个类型的指针的情况创建了一个具体化。
模板类可用作其他类、结构和模板的成员。
所有这些机制的目的都是为了让程序员能够重用经过测试的代码,而不用手工复制它们。这样可以简化编程工作,提供程序的可靠性。

《C++ Primer Plus》第14章 C++中的代码重用 学习笔记的更多相关文章

  1. C++ primer plus读书笔记——第14章 C++中的代码重用

    第14章 C++中的代码重用 1. 使用公有继承时,类可以继承接口,可能还有实现(基类的纯虚函数提供接口,但不提供实现).获得接口是is-a关系的组成部分.而使用组合,类可以获得实现,但不能获得接口. ...

  2. 《C++ Primer Plus》读书笔记之十二—C++中的代码重用

    第14章 C++中的代码重用 1.C++代码重用方法:公有继承.使用本身是另一个类的对象的类成员(这种方法称为包含.组合或层次化).私有或保护继承.类模板等. 2.模板特性意味着声明对象时,必须指定具 ...

  3. JavaSE中Collection集合框架学习笔记(2)——拒绝重复内容的Set和支持队列操作的Queue

    前言:俗话说“金三银四铜五”,不知道我要在这段时间找工作会不会很艰难.不管了,工作三年之后就当给自己放个暑假. 面试当中Collection(集合)是基础重点.我在网上看了几篇讲Collection的 ...

  4. JavaSE中Collection集合框架学习笔记(3)——遍历对象的Iterator和收集对象后的排序

    前言:暑期应该开始了,因为小区对面的小学这两天早上都没有像以往那样一到七八点钟就人声喧闹.车水马龙. 前两篇文章介绍了Collection框架的主要接口和常用类,例如List.Set.Queue,和A ...

  5. 浏览器中js执行机制学习笔记

    浏览器中js执行机制学习笔记 RiverSouthMan关注 0.0772019.05.15 20:56:37字数 872阅读 291 同步任务 当一个脚本第一次执行的时候,js引擎会解析这段代码,并 ...

  6. 《C++ Primer Plus》第15章 友元、异常和其他 学习笔记

    友元使得能够为类开发更灵活的接口.类可以将其他函数.其他类和其他类的成员函数作为友元.在某些情况下,可能需要前向声明,需要特别注意类和方法声明的顺序,以正确地组合友元.潜逃类是在其他类中生命的类,它有 ...

  7. 《C++ Primer Plus》第9章 内存模型和名称空间 学习笔记

    C++鼓励程序员在开发程序时使用多个文件.一种有效的组织策略是,使用头文件来定义用户类型,为操纵用户类型的函数提供函数原型,并将函数定义放在一个独立的源代码文件中.头文件和源代码文件一起定义和实现了用 ...

  8. JavaSE中Collection集合框架学习笔记(1)——具有索引的List

    前言:因为最近要重新找工作,Collection(集合)是面试中出现频率非常高的基础考察点,所以好好恶补了一番. 复习过程中深感之前的学习不系统,而且不能再像刚毕业那样死背面试题,例如:String是 ...

  9. DFS中的奇偶剪枝学习笔记

    奇偶剪枝学习笔记 描述 编辑 现假设起点为(sx,sy),终点为(ex,ey),给定t步恰好走到终点, s | | | + — — — e 如图所示(“|”竖走,“—”横走,“+”转弯),易证abs( ...

随机推荐

  1. ectouch ucenter用户注册失败问题

    ectouch 注册时没有给ecshop传下面这几个值: `alias` ) NOT NULL DEFAULT '' , `msn` ) NOT NULL DEFAULT '' , `qq` ) NO ...

  2. CentOS 7 系统下安装gnome图形界面

    在安装Gnome 包之前,我们需要先检查下安装源是否正常,因为我们要通过yum命令来安装gnome包, 而yum命令式通过yum 源来下载安装包的. 1.在命令行下输入下面的命令来安装 Gnome 包 ...

  3. excel导出功能优化

    先说说优化前,怎么做EXCEL导出功能的: 1. 先定义一个VO类,类中的字段按照EXCEL的顺序定义,并且该类只能用于EXCEL导出使用,不能随便修改. 2. 将查询到的结果集循环写入到这个VO类中 ...

  4. http抓包工具

    fiddler 可以用该工具抓包并修改对应的参数数据

  5. C++ 标准头文件与C头文件区别与联系以及C风格字符串

    1.cstdlib是C++里面的一个常用头文件, 等价于C中的<stdlib.h>. 2.一般一个带“.h” 扩展名的库文件,比如iostream.h.这是延续C语言的,为了兼容C.在新标 ...

  6. Entity Framework应用:使用Code First模式管理视图

    一.什么是视图 视图在RDBMS(关系型数据库管理系统)中扮演了一个重要的角色,它是将多个表的数据联结成一种看起来像是一张表的结构,但是没有提供持久化.因此,可以将视图看成是一个原生表数据顶层的一个抽 ...

  7. Specified VM install not found: type Standard VM, name jdk1.6...

    运行ant的时候出现 Specified VM install not found: type Standard VM, name.... 搞了好久..汗汗 尝试删除这些文件: ... / .meta ...

  8. [oracle] oracle的三种密码验证机制以及在windows和linux下的不同启动过程

    oracle数据库的密码验证机制: ① 操作系统验证 拥有SYSDBA和SYSOPER的用户用该方式验证此时数据库无需启动,也无需开启监听和实例服务. 要求:本地组ora_dba中有该操作系统的登录用 ...

  9. chrome 如何利用快捷键将光标移动到地址栏

    Windows: Ctrl + L 或 Alt + D 或 F6 Mac: Command + LLinux: Ctrl + L

  10. Servlet程序的入口点是?( )

    Servlet程序的入口点是?( ) A.init() B.main() C.service() D.doGet() 解答:C