中國大學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

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