类的组合:
在一个类中,可以用类对象作为数据成员,即子对象。对象成员的类型是基类。实际上,对象成员的类型可以是基类,也可以是另外一个已定义的类。在一个类中以另一个类对象作为数据成员,称为类的组合。下面通过一个简单的例子来介绍一下:
例1.声明Professor(教授)类是Teacher(教师)类的派生类,另一个类BirthDate(生日),包含year,month,day等数据成员。可以将教授生日的信息加入到Professor类的声明中。
#include <iostream>
#include <string>
using namespace std;
class Teacher //基类
{
public:
Teacher(int n, string nam, char s)
{
num=n;
name=nam;
sex=s;
}
~Teacher(){}
void display()
{
cout<<num<<endl;
cout<<name<<endl;
cout<<sex<<endl;
}
protected:
int num;
string name;
char sex;
};
class BirthDate //组合类
{
public:
BirthDate(int y,int m,int d)
{
year=y;
month=m;
day=d;
}
~BirthDate(){}
void display()
{
cout<<year<<endl;
cout<<month<<endl;
cout<<day<<endl;
}
private:
int year;
int month;
int day;
};
class Professor:public Teacher
{
public:
Professor(int n, string nam, char s, BirthDate b):Teacher(n, nam, s),birthday(b){} //组合派生类的构造函数初始化
~Professor(){}
void fun2()
{
birthday.display();
}
private:
BirthDate birthday;
};
void fun1(Teacher & t) //形参是Teacher类对象的引用,实参为Teacher类的子类对象
{
t.display();
}
int main()
{
BirthDate bir(1960,7,30); //初始化
Professor prof1(1001,"wang",'f',bir); //初始化
fun1(prof1);
prof1.fun2();
return 0;
}
类的组合和继承一样,是软件重用的重要方式。组合和继承都是有效地利用已有类的资源。但二者的概念和用法不同。通过继承建立了派生类与基类的关系,他是一种“是”的关系,如“白猫是猫”,“黑人是人”,派生类是基类的具体化实现,是基类中的一种。通过组合建立了成员类和组合类的关系,在本例中BirthDate是成员类,Professor是组合类。他们之间不是“是”的关系,而是有的关系,不能说教授(Professor)是一个生日(BirthDate),只能说教授(Professor)有一个生日(BirthDate)的属性。