继承和组合

在前边已经说明: 在一个类中可以用类对象作为数据成员,即子对象。实际上,对象成员的类型可以是本派生类的基类,也可以是另外一个已定义的类。在一个类中以另一个类的对象作为数据成员的,称为类的组合(composition)。

例如,声明Professor(教授)类是Teacher(教师)类的派生类,另有一个类BirthDate(生日),包含year,month,day等数据成员。可以将教授生日的信息加入到Professor类的声明中。如

class Teacher//教师类
{
   public:
   ┆
   private:
   int num;
   string name;
   char sex;
};
class BirthDate //生日类
{
   public :
   ┆
   private:
   int year;
   int month;
   int day;
};
class Professor:public Teacher //教授类
{
   public:
   ┆
   private:
   BirthDate birthday; //BirthDate类的对象作为数据成员
};

类的组合和继承一样,是软件重用的重要方式。组合和继承都是有效地利用已有类的资源。但二者的概念和用法不同。

Professor类通过继承,从Teacher类得到了num,name,age,sex等数据成员,通过组合,从BirthDate类得到了year,month,day等数据成员。继承是纵向的,组合是横向的。如果定义了Professor对象prof1,显然prof1包含了生日的信息。通过这种方法有效地组织和利用现有的类,大大减少了工作量。如果有
   void fun1(Teacher &);
   void fun2(BirthDate &);
在main函数中调用这两个函数:
   fun1(prof1);//正确,形参为Teacher类对象的引用,实参为Teacher类的子类对象,与之赋值兼容
   fun2(prof1.birthday);//正确,实参与形参类型相同,都是BirthDate类对象fun2(prof1);//错误,形参要求是BirthDate类对象,而prof1是Professor类型,不匹配

如果修改了成员类的部分内容,只要成员类的公用接口(如头文件名)不变,如无必要,组合类可以不修改。但组合类需要重新编译。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值