头文件IntArrayRC中含有IntArrayRC 的定义,以及在类定义之外定义的全部内联成员
函数的定义。如果我们定义了非内联函数,则把它们放在IntArrayRC.C——这个相关联的程
序文本文件中
下面这个小程序实现了IntArray 与IntArrayRC 两个类的层次结构
#include <iostream>
#include <IntArray.h>
#include <IntArrayRC.h>
extern void swap(IntArray&,int,int);
int main()
{
int array[ 4 ] = { 0, 1, 2, 3 };
IntArray ia1( array, 4 );
IntArrayRC ia2( array, 4 );
// 错误一位偏移off-by-one 应该是size-1
// IntArray 对象捕捉不到这个错误
cout << "swap() with IntArray ia1\n";
swap( ia1, 1, ia1.size() );
// ok: IntArrayRC 对象可以捕捉到这样的错误
cout << "swap() with IntArrayRC ia2\n";
swap( ia2, 1, ia2.size() );
return 0;
}
编译并执行这个程序产生如下结果
swap() with IntArray ia1
swap() with IntArrayRC ia2
Assertion failed: index >= 0 && index < size
C++支持另外两种形式的继承:多继承(multiple inheritance 也译多重继承,也就是
一个类可以从两个或多个基类派生而来)以及虚拟继承(virtual inheritance)。在这种继承方
式下,基类的单个实例在多个派生类之间共享。第18 章将讨论这些内容,面向对象程序设计的
另一个较为深入的方面是在程序执行过程中,任意一个点上我们都能够查询某类的引用或
指针所指向的实际类型。这是由RTTI 运行时刻类型识别设施提供的。我们将在19.1 节
中讨论它。