C++继承与组合详解
时间:2014-11-09 14:24 点击:次
我们知道,在一个类中可以用类对象作为数据成员,即子对象。实际上,对象成员的类型可以是本派生类的基类,也可以是另外一个已定义的类。在一个类中以另一个类的对象作为数据成员的,称为类的组合(composition)。
例如,声明Professor(教授)类是Teacher(教师)类的派生类,另有一个类BirthDate(生日),包含year,month,day等数据成员。可以将教授生日的信息加入到Professor类的声明中。如:
类的组合和继承一样,是软件重用的重要方式。组合和继承都是有效地利用已有类的资源。但二者的概念和用法不同。通过继承建立了派生类与基类的关系,它是一种 “是”的关系,如“白猫是猫”,“黑人是人”,派生类是基类的具体化实现,是基类中的一 种。通过组合建立了成员类与组合类(或称复合类)的关系,在本例中BirthDate是成员类,Professor是组合类(在一个类中又包含另一个类的对象成员)。它们之间不是‘‘是”的 关系,而是“有”的关系。不能说教授(Professor)是一个生日(BirthDate),只能说教授(Professor)有一个生日(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类型,不匹配
如果修改了成员类的部分内容,只要成员类的公用接口(如头文件名)不变,如无必要,组合类可以不修改。但组合类需要重新编译。
例如,声明Professor(教授)类是Teacher(教师)类的派生类,另有一个类BirthDate(生日),包含year,month,day等数据成员。可以将教授生日的信息加入到Professor类的声明中。如:
- class Teacher //教师类
- {
- public:
- // Some Code
- private:
- int num;
- string name;
- char sex;
- };
- class BirthDate //生日类
- {
- public:
- // Some Code
- private:
- int year;
- int month;
- int day;
- };
- class Professor:public Teacher //教授类
- {
- public:
- // Some Code
- private:
- BirthDate birthday; //BirthDate类的对象作为数据成员
- };
class Teacher //教师类 { public: // Some Code private: int num; string name; char sex; }; class BirthDate //生日类 { public: // Some Code private: int year; int month; int day; }; class Professor:public Teacher //教授类 { public: // Some Code private: BirthDate birthday; //BirthDate类的对象作为数据成员 };
类的组合和继承一样,是软件重用的重要方式。组合和继承都是有效地利用已有类的资源。但二者的概念和用法不同。通过继承建立了派生类与基类的关系,它是一种 “是”的关系,如“白猫是猫”,“黑人是人”,派生类是基类的具体化实现,是基类中的一 种。通过组合建立了成员类与组合类(或称复合类)的关系,在本例中BirthDate是成员类,Professor是组合类(在一个类中又包含另一个类的对象成员)。它们之间不是‘‘是”的 关系,而是“有”的关系。不能说教授(Professor)是一个生日(BirthDate),只能说教授(Professor)有一个生日(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类型,不匹配
如果修改了成员类的部分内容,只要成员类的公用接口(如头文件名)不变,如无必要,组合类可以不修改。但组合类需要重新编译。
顶一下
(0)
0%
踩一下
(1)
100%
上一篇:C++基类与派生类的转换
下一篇:继承在软件开发中的重要意义
相关内容:
最新内容
热点内容
- QQ群
-
微信
- 返回首页
- 返回顶部