繼承與多態性
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;
}