我们说IntArrayRC 是一种有特殊行为的IntArray,它支持对索引值的范围检查。子类型与基
类共享公共的接口common interface ——公有操作的公共集由于共享公共接口,允许了
子类和基类在程序内部可互换使用,而无需考虑对象的实际类型。从某种意义上来说,公共
接口封装了单个子类型中与类型相关的细节。类之间的类型/子类型关系形成了继承或派生层
次关系inheritance or derivation hierarchy。例如,下面的非成员函数swap()把指向基类
IntArray 对象的引用作为第一个参数,该函数交换索引i 和j 处的元素
#include <IntArray.h>
void swap( IntArray &ia, int i, int j )
{
int tmp = ia[ i ];
ia[ i ] = ia[ j ];
ia[ j ] = tmp;
}
下面是swap()函数的三个合法调用
IntArray ia;
IntArrayRC iarc;
IntSortedArray ias;
// ok ia 是一个IntArray
swap( ia, 0, 10 );
// ok: iarc 是IntArray 的子类型
swap( iarc, 0, 10 );
// ok: ias 也是IntArray 的子类型
swap( ias, 0, 10 );
// error: string 不是IntArray 的子类型
string str( "not an IntArray!" );
swap( str, 0, 10 );
三个数组类都提供了自己的下标操作符实现当然我们的要求是当调用如下函数时
swap(iarc, 0, 10);
IntArrayRC 的下标操作符被调用当调用如下函数时
swap( ias, 0, 10 );
IntSortedArray 下标操作符被调用等等。swap()调用的下标操作符必须潜在地随着每次调
用而改变。它必须由被交换元素的数组的实际类型来决定。在C++中,这可以由虚拟函数
virtual function 机制来自动完成。
为使IntArray 类能够被继承,我们需要在语法上做一点小小的改变,必须可选择的
减少封装的层次,以便允许派生类访问非公有的实现,而且我们也必须显式地指明哪些函数
应该是虚拟的。最重要的变化在于我们如何把一个类设计成为基类。