}
在这个例子中包含有B1和B2两个类,每个类只含有一个数据成员,并且均为私有的字符指针。
在B1中把无参函数定义为保护成员,它只能由本类及派生类调用,其他函数不能调用。
在B1类中定义有三个公用成员函数,一个为析构函数,用以删除a所指向的动态字符空间;第二个为输出函数,用以输出a所指向的字符串;第三个为给a赋值的函数,它首先释放a所指向的存储空间,接着根据形参字符串的长度为a动态分配所指向的存储空间,最后把形参字符串拷贝到a所指向的存储空间中。
在B2类中,定义有四个公用成员函数,一个为无参构造函数,它给字符指针b赋初值0,即置空;第二个为析构函数,它删除b所指向的动态存储空间;第三个为输出函数,用以分别输出a和b指针所指向的字符串,由于a是基类B1的私有成员,在B2中不能直接访问,只能通过调用B1提供的输出函数Output输出a字符串,又由于B2中也定义有Output函数,所以在调用B1中的这个函数时必须在函数名前加上B1和类区分符;第四个为给a和b赋值的函数,它首先调用Seta函数(因其名字在B2类中唯一,所以加不加B1和类区分符限定均可)把aa字符串赋给a指针所指向的动态字符空间,接着把bb字符串赋给b指针所指向的动态字符空间。
程序中包含有一个Input函数,该函数中的第1条语句分配具有n个元素的类型为B2的动态数组,并将其首地址赋给引用形参r,该动态数组的每一个元素将由自动调用的B2类的无参构造函数初始化,当然调用该构造函数时又将首先调用基类B1的无参构造函数,初始化属于基类的成员。
第2条语句定义两个字符数组a和b,用来保存下面循环中从键盘上输入的字符串。
第3条语句使循环体执行n次,每次从键盘的输入中顺序提取两个字符串并分别赋给a和b,然后把它们作为实参用数组r中的相应元素去调用Setb成员函数,给该元素中的属于基类的私有成员a和在派生类中定义的私有成员b赋值。
由于该函数使用的参数r为引用,所以在函数体中对r的赋值实际上是对调用该函数的对应实参的赋值,即利用实参可以得到在这个函数中动态分配的数组空间的首地址和数组中每个元素的值。
在主函数中定义有一个B2类的指针对象a并赋初值为空,用这个指针a和整型对象n作为实参去调用Input函数,该函数完成对动态分配的具有n个元素的a数组赋值的任务,接着主函数通过执行for循环输出a数组中的每个元素的值,然后使用delete语句删除(释放)指针a所指向的动态数组空间,由于动态数组中的每个元素为B2类对象,所以在释放前对于每一个元素都将自动调用B2类的析构函数,删除b指针所指向的动态字符串空间,又由于B2类包含有基类B1,所以在执行B2类的析构函数的函数体之后,待返回之前,将自动调用基类B1的析构函数,删除a指针所指向的动态字符串空间,然后由基类B1的析构函数返回到B2的析构函数,再由