中国大学MOOC程序设计与算法(三):C++ 面向对象程序设计 第五周 继承 笔记 之 继承和派生的基本概念

第五周 继承
1.继承和派生的基本概念
2.继承关系和复合关系
3.覆盖和保护成员
4.派生类的构造函数
5.公有(public)继承的赋值兼容原则

1.继承和派生的基本概念

继承:在定义一个新的类B时,如果该类与某个已有的类A相似(指的是B拥有A的全部特点),那么就可以把A作为一个 基类,而把B作为基类的一个 派生类( 也称子类) 。

派生类是通过对基类进行修改和扩充得到的。在派生类中,可以扩充新的成员变量和成员函数。
派生类一经定义后,可以独立使用,不依赖于基类。
派生类拥有基类的全部成员函数和成员变量,不论是private、protected、public 。
派生类的各个成员函数中,不能访问基类中的private成员。
一个派生类对象也是基类对象。

需要继承机制的例子

所有的学生都有的共同属性:
姓名,学号,性别,成绩
所有的学生都有的共同方法(成员函数):
是否该留级,是否该奖励
而不同的学生,又有各自不同的属性和方法
研究生:导师,系
大学生:系
中学生:竞赛特长加分
如果为每类学生都从头编写一个类,显然会有不少重复的代码,浪费。

派生类的写法

class 派生类名:public 基类名
{
};
class CStudent {
	private:
		string sName;
		int nAge;
	public:
		bool IsThreeGood() { };
		void SetName( const string & name )
		{ sName = name; }
		//......
};
class CUndergraduateStudent: public CStudent {
	private:
		int nDepartment;
	public:
		bool IsThreeGood() { ...... }; //覆盖,对基类进行修改
		bool CanBaoYan() { .... };
}; // 派生类的写法是:类名: public 基类名
class CGraduatedStudent:public CStudent {
	private:
		int nDepartment;
		char szMentorName[20];
	public:
		int CountSalary() { ... };
};

派生类对象的内存空间

派生类对象的体积,等于基类对象的体积,再加上派
生类对象自己的成员变量的体积。在派生类对象中,包
含着基类对象,而且基类对象的存储位置位于派生类对
象新增的成员变量之前。

class CBase
{
	int v1,v2;
};
class CDerived:public CBase
{
	int v3;
};

在这里插入图片描述

例子,继承实例程序:学籍管理

#include <iostream>
#include <string>
using namespace std;
class CStudent {
	private:
		string name;
		string id; //学号
		char gender; //性别,'F'代表女,'M'代表男
		int age;
	public:
		void PrintInfo();
		void SetInfo( const string & name_,const string & id_,int age_, char gender_ );
		string GetName() { return name; }
};
class CUndergraduateStudent:public CStudent
{
	//本科生类,继承了CStudent类
	private:
		string department; //学生所属的系的名称
	public:
		void QualifiedForBaoyan() { //给予保研资格
			cout << “qualified for baoyan” << endl;
		}
		void PrintInfo() {//覆盖了基类的PrintInfo()
			CStudent::PrintInfo(); //调用基类的PrintInfo
			cout << “Department:<< department <<endl;
		}
		void SetInfo( const string & name_,const string & id_,int age_,char gender_ ,const string & department_) {
			CStudent::SetInfo(name_,id_,age_,gender_); //调用基类的SetInfo
			department = department_;
		}
};
void CStudent::PrintInfo()
{
	cout << "Name:" << name << endl;
	cout << "ID:" << id << endl;
	cout << "Age:" << age << endl;
	cout << "Gender:" << gender << endl;
}
void CStudent::SetInfo( const string & name_,const string & id_,int age_,char gender_ )
{
	name = name_;
	id = id_;
	age = age_;
	gender = gender_;
}
void CStudent::PrintInfo()
{
	cout << "Name:" << name << endl;
	cout << "ID:" << id << endl;
	cout << "Age:" << age << endl;
	cout << "Gender:" << gender << endl;
}
void CStudent::SetInfo( const string & name_,const string & id_,int age_,char gender_ )
{
	name = name_;
	id = id_;
	age = age_;
	gender = gender_;
}
int main()
{
	CUndergraduateStudent s2;
	s2.SetInfo(“Harry Potter ”,118829212,19,‘M’,“Computer Science”);
	cout << s2.GetName() << “ ” ;
	s2.QualifiedForBaoyan ();
	s2.PrintInfo ();
	return 0;
}
输出结果:
Harry Potter qualified for baoyan
Name:Harry Potter
ID:118829212
Age:19
Gender:M
Department:Computer Science

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章