14. c++中的代码重用
1. 包含对象成员的类
1.1. valaray类简介
使用explicit关闭隐式转换
valarray类是由头文件valarray支持的。顾名思义,这个类用于处理数值(或具有类似特性的类),它支持诸如将数组中所有元素的值相加以及在数组中找出最大和最小的值等操作。valarray被定义为一个模板类,以便能够处理不同的数据类型。
valaray类的方法:

C++包含让程序员能够限制程序结构的特性一使用xplicit防止单参数构造函数的隐式转换,使用cost限制方法修改数据,等等。这样做的根本原因是:在编译阶段出现错误优于在运行阶段出现错误。
2. 私有继承
C++还有另一种实现has-a关系的途径一私有继承。使用私有继承,基类的公有成员和保护成员都将成为派生类的私有成员。这意味着基类方法将不会成为派生对象公有接口的一部分,但可以在派生类的成员函数中使用它们。
使用private定义类


省略了显式对象名称,并在内联构造函数中使用了类名,而不是成员名。
使用私有继承时,只能在派生类的方法中使用基类的方法。
私有继承使得能够使用类名和作用域解析运算符来调用基类的方法:

访问基类对象:

访问基类的友元函数

2.1. 保护继承

使用保护继承时,基类的公有成员和保护成员都将成为派生类的保护成员。
3. 多重继承
正如本章前面讨论的,私有MI和保护MI可以表示has-a关系。

3.1.

通常,这种赋值将把基类指针设置为派生对象中的基类对象的地址。但ed中包含两个Worker对象,有两个地址可供选择,所以应使用类型转换来指定对象:

这将使得使用基类指针来引用不同的对象(多态性)复杂化。
3.1.1. 虚基类

现在,Singing Waiter对象将只包含Worker对象的一个副本。从本质上说,继承的Singer和Waiter对象共享一个Worker对象,而不是各自引入自己的Worker对象副本(请参见图l4.5)。因为Singing Waiter现在只包含了一个Worker子对象,所以可以使用多态。

C++在基类是虚的时,禁止信息通过中间类自动传递给基类。

警告:如果类有间接虚基类,则除非只需使用该虚基类的默认构造函数,否则必须显式地调用该虚基类的某个构造函数。
警告:多重继承可能导致函数调用的二义性。

- 对于单继承来说,让派生方法调用基类的方法是可以的。
- 那么,一个成员名如何优先于另一个成员名呢?派生类中的名称优先于直接或间接祖先类中的相同名称。例如,在下面的定义中:
4. 类模板
首先介绍一个允许指定数组大小的简单数组模板。一种方法是在类中使用动态数组和构造函数参数来提供元素数目。
另一种方法是使用模板参数来提供常规数组的大小,C++11新增的模板array就是这样做的。

表达式参数方法的主要缺点是,每种数组大小都将生成自己的模板。也就是说,下面的声明将生成两个独立的类声明:

