第五章 类的继承与派生之——类之间的关系

本文详细介绍了C++中类之间的关系,包括继承(如isa/hasa)、组合继承以及封闭类的概念。通过实例展示了如何使用这些概念创建和操作类,并给出了一个例题来测试对继承机制的理解。
摘要由CSDN通过智能技术生成

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”表示包含关系

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

润小仙女

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值