类之间的关系
1、已有类编写新的类
使用已有类编写新的类有两种方式: 继承和组合
继承关系也称为 “is a” 或 “是” 关系
组合关系也称为 “has a” 或 “有” 关系
2、封闭类
如果一个类的成员变量是另一个类的对象,则为封闭类
定义封闭类构造函数的一般形式为:
类名: :类名(形参表) : 内对象1 (形参表),内对象2 (形参表),~
{类体}
*在派生类也是封闭类的情况下,构造函数的初始化列表不但要指明基类对象的初始化方式,还要指明成员的初始化方式。
生成派生类对象时,会引发一系列构造函数的调用,顺序是: 先根据派生类层次从上到下依次执行所有基类的构造函数,最后执行自身的构造函数。如果某个类是封闭类,则在执行本类构造函数之前,先按照成员对象的定义顺序执行各个成员对象所属类的构造函数。
【示例】
#include<iostream>
#include<string>
using namespace std;
classmyDate
{
public:
myDate();
myDate(int);
myDate(int,int);
myDate(int,int,int);
myDate(const myDate &d) ;
~myDate();
void setDate(int,int,int);
void setDate(myDate);
myDate getDate();
void setYear(int);
int getMonth();
void printDate() const;
private:
int year,month ,day;
};
myDate::myDate ()
{
year=1970;
month=1;
day=1;
cout<<"myDate默认构造函数"<<endl;
}
myDate::myDate(int y)
{
year=y;
month=1;
day=1;
cout<<"myDate带1个构造函数"<<endl;
}
myDate::myDate(int y,int m)
{
year=y;
monthem ;
day=1;
cout<<"myDate带2个构造函数"<<endl;
}
myDate::myDate(int y,int m,int d)
{
year=y;
month=m;
day=d;
cout<<"myDate带3个构造函数"<<end1;
}
myDate::myDate (const myDate &d)
{
year=d.year;
month=d.month ;
lay=d.day;
cout<<"myDate_copy构造函数"<<endl;
}
myDate::~myDate ()
{
cout<<"myDate析构函数"<<end1;
}
void myDate::setDate(int y,int m,int d)
{
year=y;
month=m;
day=d;
return;
}
myDate myDate::getDate ()
{
myDate d;
d.year=year;
d.month=month;
d.day=day;
return d;
}
void myDate::setYear (int y)
{
year=y;
return ;
}
int myDate::getMonth ()
{
return month;
}
void myDate::printDate() const
{
cont<<year<<"/"<<month<<"/"<<day;
return;
}
class CStudent
{
public:
CStudent () ;
CStudent(string,myDate)
~CStudent ();
void setStudent(string,myDate) ;
void setName(string);
string getName();
void setBirthday(myDate);
myDate getBirthday() ;
void printInfo()eonst;
private:
string name;
myDate birthday;
};
CStudent::CStudent():name("Noname"),birthday(myDate())
{
cout<<"CStudent默认构造函数"<<end1;
}
CStudent::CStudent (string str,myDate d) :name (str) ,birthday (d)
{
cout<<"CStudent有参构造函数"<<end1;
}
CStudent::~CStudent()
{
cout<<"CStudent析构函数"<<end1;
}
void CStudent::setStudent (string s,myDate d)
{
name=s;
birthday.setDate(d);
return;
}
void CStudent::setName (string n)
{
name=n;
return;
}
string CStudent::getName ()
{
return name;
}
void Cstudent::setBirthday(myDate d)
{
birthday.setDate(d);
return ;
}
myDate CStudent::getBirthday ()
{
return birthday;
}
void Cstudent::printInfo()const
{
cout<<"姓名: "<<name<<"\t生日:";
birthday.printDate () ;
cout<<end1;
}
class CUndergraduateStudent:publie CStudent
{
private:
string department ;
public:
CUndergraduatestudent () ;
CUndergraduatestudent (string,myDate);
~CUndergraduatestudent ();
voidsetDep(string) ;
void printInfo()eonst;
};
CUndergraduatestudent::CUndergraduatestudent ()
{
cout<<"CUndergraduatestudent默认构造函数"<<end1;
}
CUndergraduateStudent::CUndergraduateStudent(string str,myDate d):CStudent (str,d)
{
cout<<"CUndergraduatestudent有参构造函数"<<endl;
}
CUndergraduatestudent::CUndergraduatestudent ()
{
cout<<"cUndergraduatestudent析构函数"<<end1;
}
void CUndergraduatestudent::setDep(string dep)
{
department=dep;
}
void CUndergraduatestudent::printInfo() const
{
CStudent::printInfo() ;
cout<<"院系:\t"<<department<<endl<<endl;
}
int main()
{
CUndergraduatestudents2("小张",myDate());
return 0;
}
【运行结果】
myDate默认构造函数
myDate_COPY构造函数
myDate_COPY构造函数
CStudent有参构造函数
myDate析构函数
CUndergraduateStudent有参构造函数
myDate析构函数
CUndergraduateStudent析构函数
CStudent析构函数
myDate析构函数
3、例题
例题1:[单选题]下列关于类的描述中,正确的是 ()
A. 基类具有派生类的特征
B. 一个类只能从一个类继承
C.“is a”关系具有传递性
D.“has a”关系 表示类的继承机制
【正确答案】:C
【答案解析】:派生类具有基类的特性,C++支持多重继承继承关系具有传递性,“has a”表示包含关系