繼承與多態性2019年11月7

繼承與多態性
1、實驗目的
瞭解類的兩種使用方式
學習從現有類派生出新類的方式
瞭解在派生類中如何使用基類的成員
瞭解基類成員在派生類中的訪問控制
瞭解虛函數對多態性的支持
2、實驗內容
題目:應用多態設計學生類
生成表示學生的類XS,提供成員函數dispXM()、dispXB()和dispNL()分別用來顯示姓名、性別和年齡,並將他們全部定義爲純虛函數;生成CZS類表示初中生,包含數據成員xm、xb和nl表示學生的姓名、性別和年齡,提供成員函數dispXM()、dispXB()和dispNL()分別用來顯示姓名、性別和年齡;再生成類GZS表示高中生和類DXS表示大學生,同樣包含相同含義的數據成員xm、xb和nl,也包括成員函數dispXM()、dispXB()和dispNL()。
實驗要求
① 設計和實現基類XS。
② 設計和實現派生類CZS、GZS、DXS。
③ 分別生成CZS、GZS、DXS類的對象。
④ 將CZS、GZS、DXS類對象的地址賦給XS類的指針變量。
⑤ 分別用XS類的指針和引用訪問dispXM()、dispXB()和dispNL()函數。
⑥ 觀察程序結果。

#include <iostream>
#include <string.h>
using namespace std;
//設計抽象類(XS)表示學生類,定義其中dispXM(),dispXB(),dispNL()三個函數爲純虛函數
class XS {
	public:
		virtual void dispXM()=0;
		virtual void dispXB()=0;
		virtual void dispNL()=0;
};
/*定義CZS類,使其繼承XS類,包含三個數據成員xm(4個以內漢字,默認名爲"張三"),
  xb(int型,1表示男,0表示女,默認爲1),nl(int型,默認爲14);定義構造函數,
	初始化各數據成員.另:實現基類的三個純虛函數,顯示各數據成員.
*/
class CZS:public XS {
	public:
		CZS(char *m="張三",int b=1,int n=14) {
			strcpy(xm,m);
			xb=b;
			nl=n;
		}
		void dispXM() {
			cout<<"初中生"<<endl;
			cout<<"姓名:"<<xm<<endl;
		}
		void dispXB() {
			cout<<"性別(男1女0):"<<xb<<endl;
		}
		void dispNL() {
			cout<<"年齡:"<<nl<<endl;
		}
	protected:
		char xm[9];
		int xb,nl;
};
//仿照上面的寫法,定義高中生類(GZS)和大學生類(DXS)
class GZS:public XS {
	public:
		GZS(char *m="張三",int b=1,int n=17) {
			strcpy(xm,m);
			xb=b;
			nl=n;
		}
		void dispXM() {
			cout<<"高中生"<<endl;
			cout<<"姓名:"<<xm<<endl;
		}
		void dispXB() {
			cout<<"性別(男1女0):"<<xb<<endl;
		}
		void dispNL() {
			cout<<"年齡:"<<nl<<endl;
		}
	protected:
		char xm[9];
		int xb,nl;
};
class DXS:public XS {
	public:
		DXS(char *m="張三",int b=1,int n=20) {
			strcpy(xm,m);
			xb=b;
			nl=n;
		}
		void dispXM() {
			cout<<"大學生"<<endl;
			cout<<"姓名:"<<xm<<endl;
		}
		void dispXB() {
			cout<<"性別(男1女0):"<<xb<<endl;
		}
		void dispNL() {
			cout<<"年齡:"<<nl<<endl;
		}
	protected:
		char xm[9];
		int xb,nl;
};
void displayP(XS *p) {
	p->dispXM();
	p->dispXB();
	p->dispNL();
}
void displayR(XS &r) {
	r.dispXM();
	r.dispXB();
	r.dispNL();
}
//主函數
int main() {
	CZS czs("趙一",1,12);
	GZS gzs("錢二",0,15);
	DXS dxs("孫三",1,18);
	cout<<"定義抽象基類的指針變量"<<endl;
	XS *p;//定義抽象基類的指針變量p
	p=&czs;//將初中生對象czs的地址賦給p
	displayP(p);
	p=&gzs;//將高中生對象czs的地址賦給p
	displayP(p);
	p=&dxs;//將大學生對象czs的地址賦給p
	displayP(p);
	cout<<"\n----------------------------------------\n";
	cout<<"定義抽象基類的引用變量爲別名"<<endl;
	XS &r1=czs;//定義抽象基類的引用變量r1爲czs的別名
	displayR(r1);
	XS &r2=gzs;//定義抽象基類的引用變量r2爲czs的別名
	displayR(r2);
	XS &r3=dxs;//定義抽象基類的引用變量r3爲czs的別名
	displayR(r3);
	cout<<"\n----------------------------------------\n";
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章