




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
8.1多態(tài)性概述
8.2虛函數(shù)
8.3抽象類
8.4虛析構(gòu)函數(shù)
8.5綜合實例
8.6重載、覆蓋和隱藏第8章
多態(tài)與虛函數(shù)一種語言若不支持多態(tài),則不能稱之為面向?qū)ο蟮某绦蛟O(shè)計語言。本章要討論的多態(tài)性與前面我們介紹的繼承、封裝等一樣,都是面向?qū)ο蟪绦蛟O(shè)計語言中的重要特征。多態(tài)性與繼承是密不可分的,本章所講的多態(tài)性指在繼承類中與基類同名、同參數(shù)、同類型函數(shù)的不同行為。一般來說,C++語言支持兩種不同類型的多態(tài):編譯時多態(tài)和運行時多態(tài)。本章討論的內(nèi)容主要集中在運行時多態(tài)及其實現(xiàn)。多態(tài)就是指不同的對象接受到相同的消息時產(chǎn)生不同的響應(yīng)動作,即對應(yīng)相同的函數(shù)名,卻執(zhí)行了不同的函數(shù)體(當(dāng)然,這些函數(shù)體還是要事先定義好,以便調(diào)用)。種把程序標(biāo)示符與和一個存儲地址相聯(lián)系的過程,稱為聯(lián)編(binding,又譯為綁定)。【
8.1多態(tài)性概述】靜態(tài)聯(lián)編:指這種聯(lián)編在編譯階段完成的,由于聯(lián)編過 程是在程序運行前完成的,所以又稱為早 期聯(lián)編。靜態(tài)聯(lián)編能夠?qū)崿F(xiàn)編譯時多態(tài)。動態(tài)聯(lián)編:指這種聯(lián)編要在程序運行時動態(tài)進(jìn)行,所以 又稱為晚期聯(lián)編。動態(tài)聯(lián)編可以實現(xiàn)運行時 多態(tài)。要實現(xiàn)靜態(tài)聯(lián)編,在編譯階段就必須確定標(biāo)示符(如函數(shù)名)和代碼之間的對應(yīng)關(guān)系。重載多態(tài):是函數(shù)重載。強制轉(zhuǎn)換多態(tài):不同類型的數(shù)據(jù)類型進(jìn)行 混合運算時要進(jìn)行的強制 類型轉(zhuǎn)換。包含多態(tài):指在基類及其派生類族中同名 函數(shù)的不同函數(shù)實現(xiàn),及其在 運行時的不同響應(yīng)。參數(shù)多態(tài):在后面章節(jié)中進(jìn)行探討。編譯時多態(tài)和運行時多態(tài)的嚴(yán)格劃分都是通用多態(tài)都是專用多態(tài)【
8.1多態(tài)性概述】支持兩種編譯方式【例8-1】通過基類指針訪問派生類對象#include<iostream.h>
classBase//聲明基類Base{private: doublebaseTest;public: Base(doubleinitial=0.0){baseTest=initial;} ~Base(){} voidsetBase(double
val){baseTest=val;} doublegetBase(){return
baseTest;} voiddisplay();//用于顯示基類中的私有數(shù)據(jù)成員};
例8-1通過基類指針訪問派生類對象【
8.2虛函數(shù)】classDerived:publicBase//從基類Base以公有派生類Derived{private: doublederivedTest;public:
FromBase(){}
FromBase(double
initBase,double
initDerived):Base(initBase) {derivedTest=initDerived;} ~FromBase(){} voidsetFrom(double
set){derivedTest=set;} doublegetFrom(){return
derivedTest;} voiddisplay();//顯示派生類的私有數(shù)據(jù)成員};
通過基類指針訪問派生類對象例8-1//類的實現(xiàn)voidBase::display(){
cout<<"在基類Base中,其私有屬性baseTest值是:"<<endl;
cout<<“baseTest:"<<baseTest<<endl;}
voidDerived::display(){
cout<<"在派生類Derived中,其私有屬性derivedTest值是:"<<endl;
cout<<“derivedTest:"<<derivedTest<<endl;}//主程序intmain(){ BasemyBase(1.0); DerivedmyDerived(2.0,3.0); Base*ptrBase=&myBase;//聲明指向基類對象的指針
Derived*ptrDerived=&myDerived;//聲明指向派生類對象的指針(續(xù))
myBase.display();
ptrBase->display();
myDerived.display();
ptrDerived->display();
ptrBase=&myDerived;//將基類指針指向派生類對象
ptrBase->display(); return0;}
在基類Base中,其私有屬性baseTest值是:baseTest:1在基類Base中,其私有屬性baseTest值是:baseTest:1在派生類Derived中,其私有屬性derivedTest值是:derivedTest:3在派生類Derived中,其私有屬性derivedTest值是:derivedTest:3在基類Base中,其私有屬性baseTest值是:baseTest:2
(續(xù))#include<iostream.h>#include<string.h>classFruit//水果類的聲明及其實現(xiàn){public:Fruit(){}~Fruit(){}virtualvoiddispFruitName()//用virtual聲明虛函數(shù)dispFruitName(){cout<<″It′sfruitclass!″<<endl;}//虛函數(shù)dispFruitName()在基類中
//的實現(xiàn)
virtualvoidtaste() {cout<<″Cannoteatanabstractfruit!″<<endl;}}; 水果類例8-2classApple:publicFruit//公有派生類Apple{private:charappleName[20];public:Apple(){}~Apple(){}voidsetAppleName(char
applename[20]){strcpy(appleName,applename);}voiddispAppleName(){cout<<″Theapplenameis:″<<appleName<<endl;}voiddispFruitName(){cout<<″Thefruitnameisapple.″<<endl;}//派生類中
//虛函數(shù)dispFruitName()的實現(xiàn)
voidtaste(){cout<<″It′ssomeacid!″<<endl;}//派生類中虛函數(shù)
//eatFruit()的實現(xiàn)};classOrange:publicFruit//公有派生類Orange{private:charorangeName[20];public:
(續(xù))
Orange(){}~Orange(){}voidsetOrangeName(char
orangename[20]){strcpy(cOrangeName,orangename);}voiddispOrangeName(){cout<<″Theorangenameis:″<<orangeName<<endl;}voiddispFruitName(){
cout<<″Thefruitnameisorange.″<<endl;}//派生類中虛函數(shù)dispFruitName()的實現(xiàn)
voidtaste(){cout<<″It′ssweet!″<<endl;}//派生類中虛函數(shù)
//eatFruit()的實現(xiàn)};//主程序開始#include<iostream.h>intmain(){Fruitmyfruit,*ptrfruit;//聲明水果類的對象及指針
(續(xù))
Applemyapple,*ptrapple;//聲明蘋果類的對象及指針
Orangemyorange,*ptrorange;//聲明橘子類的對象及指針
myapple.setAppleName(″Guoguang″);
myorange.setOrangeName(″Huangyan″);
ptrfruit=&myfruit;
ptrapple=&myapple;
ptrorange=&myorange;
ptrfruit->dispFruitName();
ptrfruit->taste();
ptrapple->dispFruitName();
ptrapple->dispAppleName();
ptrapple->taste();
ptrorange->dispFruitName();
ptrorange->dispOrangeName();
ptrorange->taste();
(續(xù))ptrfruit=ptrapple;//將基類指針指向派生類對象
ptrfruit->dispFruitName();//執(zhí)行派生類的成員函數(shù)
ptrfruit->taste();
ptrfruit=ptrorange;//將基類指針指向派生類對象
ptrfruit->dispFruitName();//執(zhí)行派生類的成員函數(shù)
ptrfruit->taste();}//主程序結(jié)束說明:聲明了基類指針,就可以使不同的派生類對象產(chǎn)生不同的函數(shù)調(diào)用,實現(xiàn)了程序的運行時多態(tài)。運行時多態(tài)應(yīng)該使用虛函數(shù),并通過指針、引用或者成員函數(shù)調(diào)用虛函數(shù)。(續(xù))
It′sfruitclass!Cannoteatanabstractfruit!Thefruitnameisapple.Theapplenameis:GuoguangIt′ssomeacid!Thefruitnameisorange.Theorangenameis:HuangyanIt′ssweet!Thefruitnameisapple.Theapplenameis:GuoguangIt′ssomeacid!Thefruitnameisorange.Theorangenameis:HuangyanIt′ssweet!聲明虛成員函數(shù)的語法是正如上例中我們所看到的:
virtual函數(shù)類型函數(shù)名稱(形式參數(shù)表);虛函數(shù)的聲明只能出現(xiàn)在類聲明時的函數(shù)原型聲明中。在派生類中可以不顯示地聲明為虛函數(shù),系統(tǒng)會自動判別該函數(shù)是虛函數(shù)或者重載函數(shù)。注(續(xù))函數(shù)無法具體實現(xiàn)(或不必實現(xiàn))。這樣的函數(shù)可以聲明為純虛函數(shù)。對于純虛函數(shù),可以不必定義它的函數(shù)體。含有純虛函數(shù)的類被稱為抽象類。設(shè)計抽象類的目的就是為了多態(tài)地使用它的成員函數(shù),由此為整個類族規(guī)定統(tǒng)一的接口形式。純虛函數(shù)的語法形式是:
virtual函數(shù)類型函數(shù)名(參數(shù)表)=0;特點是在函數(shù)名及參數(shù)表后面多了一個“=0”。注一旦在基類中聲明了純虛函數(shù),該基類就成為抽象類,若該類的某個派生類沒有給出基類中的純虛函數(shù)的全部實現(xiàn),則該派生類依然是抽象類?!?/p>
8.3抽象類】可以聲明指向抽象類的指針,雖然該指針不能指向任何抽象類的對象(因為不存在),但可以通過該指針獲得對派生類成員函數(shù)的調(diào)用。#include<iostream.h>#include<string.h>classFruit//聲明抽象類{public:Fruit(){}~Fruit(){}virtualvoiddispFruitName()=0;//聲明為純虛函數(shù)
virtualvoidtaste()=0;//聲明為純虛函數(shù)};classApple:publicFruit//派生類為非抽象類{ 改進(jìn)后的水果類——抽象類說明:水果本身是一個抽象的概念。所以可以考慮用抽象類來實現(xiàn)水果類。例8-3private:charappleName[20];public:Apple(){}~Apple(){}voidsetAppleName(char
applename[20]){strcpy(appleName,applename);}voiddispAppleName(){cout<<″Theapplenameis:″<<appleName<<endl;}voiddispFruitName(){cout<<″Thefruitnameisapple.″<<endl;}//實現(xiàn)基類
//中的純虛函數(shù)
voidtaste(){cout<<″It′ssomeacid!″<<endl;}//實現(xiàn)基類中的純虛
//函數(shù)};classOrange:publicFruit//派生類為非抽象類{private:charorangeName[20];public:Orange(){}~Orange(){}
(續(xù))
voidsetOrangeName(char
orangename[20]){strcpy(orangeName,orangename);}voiddispOrangeName(){cout<<″Theorangenameis:″<<orangeName<<endl;}voiddispFruitName(){cout<<″Thefruitnameisorange.″<<endl;}//實現(xiàn)基
//類中的純虛函數(shù)
voidtaste(){cout<<″It′ssweet!″<<endl;}//實現(xiàn)基類中的純虛函
//數(shù)};//主程序#include<iostream.h>intmain(){Fruit*ptrfruit;//聲明指向虛基類的指針
Applemyapple;Orangemyorange;
myapple.setAppleName(″Guoguang″);
myorange.setOrangeName(″Huangyan″);
(續(xù))
ptrfruit=&myapple;//將虛基類指針指向派生類的對象
ptrfruit->dispFruitName();
ptrfruit->taste();
ptrfruit=&myorange;//將虛基類指針指向派生類對象
ptrfruit->dispFruitName();
ptrfruit->taste();return0;}
Thefruitnameisapple.Theapplenameis:GuoguangIt′ssomeacid!Thefruitnameisorange.Theorangenameis:HuangyanIt′ssweet!(續(xù))求不同類型圖形的位置和面積#include<iostream.h>#include<string.h>classShape//聲明抽象類作為基類{protected:doublex;doubley;public:Shape(){}Shape(doublexx,doubleyy);~Shape(){}virtualvoiddispName()=0;//聲明純虛函數(shù)
virtualvoiddispArea()=0;//聲明純虛函數(shù)
virtualvoiddispPos()=0;//聲明純虛函數(shù)};
說明:在基類中聲明3個虛函數(shù),dispName(),dispArea()和dispPos()。這些虛函數(shù)在其派生類Circle和Rectangle中獲得不同的實現(xiàn)。例8-4classCircle:publicShape//聲明派生類Circle{private:doubleradius;doublearea;public:Circle(doublecx=1,doublecy=1,doublerad=1);~Circle();voiddispName();voiddispArea()voiddispPos();};classRectangle:publicShape//聲明派生類Rectangle{private:doublelength;doublewidth;doublearea;public:Rectangle(doublecx=1,doublecy=1,doublelen=2,doublewid=1);
(續(xù))
~Rectangle();voiddispName();voiddispArea();voiddispPos();};#include<iostream.h>Shape::Shape(doublexx,doubleyy):x(xx),y(yy){}
Circle::Circle(doublecx,doublecy,doubleradi):Shape(cx,cy),radius(radi){}Circle::~Circle(){} (續(xù))voidCircle::dispName()//實現(xiàn)基類中的純虛函數(shù){
cout<<endl;
cout<<″Currentshape′snameisCircle!″<<endl;}voidCircle::dispArea()//實現(xiàn)基類中的純虛函數(shù){area=3.14*radius*radius;
cout<<endl;
cout<<″Theareaofthecircleis:″<<area<<endl;}voidCircle::dispPos()//實現(xiàn)基類中的純虛函數(shù){
cout<<endl;
cout<<″Thecircle′scenterpointis:″<<″(″<<x<<″,″<<y<<″)″<<endl;}Rectangle::Rectangle(doublecx,doublecy,doublelen,double
wid):Shape(cx,cy),length(len),width(wid){}
(續(xù))Rectangle::~Rectangle(){}voidRectangle::dispName()//實現(xiàn)基類中的純虛函數(shù){
cout<<endl;
cout<<″Currentshape′snameisRectangle!″<<endl;}voidRectangle::dispArea()//實現(xiàn)基類中的純虛函數(shù){area=length*width;
cout<<endl;
cout<<″Theareaoftherectangleis:″<<area<<endl;}voidRectangle::dispPos()//實現(xiàn)基類中的純虛函數(shù){
cout<<endl;
(續(xù))
cout<<″Therectangle′sleftuppositionis:″<<″(″<<x<<″,″<<y<<″)″<<endl;}//主程序#include<iostream.h>intmain(){Shape*ptrshape;//聲明抽象類指針
Circlecircle1(20,30,30);//聲明派生類Circle的對象
Rectanglerect1(40,40,80,20);//聲明派生類Rectangle的對象
circle1.dispName();circle1.dispArea();circle1.dispPos();
ptrshape=&circle1;//抽象類指針指向派生類Circle的對象
ptrshape->dispName();
ptrshape->dispArea();
ptrshape->dispPos();
(續(xù))
rect1.dispName();rect1.dispArea();rect1.dispPos();
ptrshape=&rect1;//抽象類指針指向派生類Rectangle的對象
ptrshape->dispName();
ptrshape->dispArea();
ptrshape->dispPos();return0;}
Currentshape′snameisCircle!Theareaofthecircleis:2826Thecircle′scenterpointis:(20,30)Currentshape′snameisCircle!Theareaofthecircleis:2826Thecircle′scenterpointis:(20,30)Currentshape′snameisRectangle!Theareaoftherectangleis:1600Therectangle′sleftuppositionis:(40,40)Currentshape′snameisRectangle!Theareaoftherectangleis:1600Therectangle′sleftuppositionis:(40,40)(續(xù))【
8.4虛析構(gòu)函數(shù)】在使用虛函數(shù)的過程中,如果派生類中存在動態(tài)內(nèi)存分配,并且清理工作是在其析構(gòu)函數(shù)中進(jìn)行的,這時就需要使用虛析構(gòu)函數(shù)來防止可能的內(nèi)存泄漏。例8-6使用虛析構(gòu)函數(shù)防止內(nèi)存泄漏。#include<iostream.h>
classBase//基類{public: Base() {
bptr=newchar[8];//基類中的動態(tài)內(nèi)存分配
cout<<"InBaseConstructor!"<<endl; }virtual~Base()//基類中的析構(gòu)函數(shù)是虛函數(shù){ delete[]bptr;//基類中析構(gòu)函數(shù)內(nèi)存釋放
cout<<"InBaseDestructor!"<<endl;}virtualvoiddisp(){cout<<"InBase!"<<endl;}private: char*bptr;};
classDerived:publicBase{//派生類public: Derived(){
dptr=newchar[64];//派生類中的動態(tài)內(nèi)存分配
cout<<"InDerivedConstructor!"<<endl; } ~Derived(){ delete[]dptr;//派生類的析構(gòu)函數(shù)釋放內(nèi)存
cout<<"InDerivedDestructor!"<<endl; } voiddisp(){cout<<"InDerived!"<<endl;}private: char*dptr;};//測試程序intmain(){ Base*b=newDerived; b->disp(); deleteb; return0;}
程序輸出:InBaseConstructor!InDerivedConstructor!InDerived!InDerivedDestructor!InBaseDestructor!現(xiàn)假設(shè)某高校按如下方式確定教師工資:對于在某一學(xué)科取得突出成就的學(xué)術(shù)帶頭人聘為特聘教授,給予每月10000元的津貼;對于其他有突出貢獻(xiàn)的教學(xué)科研骨干聘為責(zé)任教授,給予每月5000元的津貼。普通教學(xué)和科研人員則從其教學(xué)課時和科研經(jīng)費中獲得補助。特聘教授和責(zé)任教授原工資待遇不變。根據(jù)上述要求,可以聲明基類為教師(Teacher),該基類包含一些所有教師共有的數(shù)據(jù)比如教師的姓名、級別、編號、月工資;該基類的成員函數(shù)中計算工資、顯示教師的基本信息可以考慮聲明為純虛函數(shù),因為對于抽象的教師類來說,這些成員函數(shù)不具有實際意義。【
8.5綜合實例】
Teacher類的屬性包括: 編號 姓名 級別 月工資 教工總數(shù)(靜態(tài)變量)Teacher類的成員函數(shù)包括: 構(gòu)造函數(shù) 析構(gòu)函數(shù)(應(yīng)為虛函數(shù)) 設(shè)置級別 計算工資(應(yīng)為虛函數(shù)) 顯示教工基本信息(應(yīng)為虛函數(shù))
從Teacher類可以派生教學(xué)人員類(NorProf)和研究人員類(ResProf):NorProf類從Teacher類派生類,其屬性還包括: 每月授課課時數(shù) 每課時補助NorProf類的成員函數(shù)包括: 構(gòu)造函數(shù) 設(shè)置級別 計算工資(工資包括基本工資+課時補助)
顯示教工基本信息ResProf類從Teacher類派生,其屬性還包括:每月承擔(dān)的科研經(jīng)費總數(shù) 提成比例ResProf類的成員函數(shù)包括: 構(gòu)造函數(shù) 設(shè)置級別 計算工資(工資包括基本工資+科研經(jīng)費提成)
顯示教工基本信息特聘教授SpecProf類,該類從教學(xué)人員類NorProf和研究人員類ResProf派生SpecProf類的屬性還包括:每月固定津貼SpecProf類的成員函數(shù)包括:構(gòu)造函數(shù)設(shè)置級別計算工資(基本工資+津貼+課時補助+科研提成)顯示教工基本信息
責(zé)任教授RespProf類,該類從教學(xué)人員類NorProf和研究人員類ResProf派生RespProf類的屬性還包括:每月固定津貼RespProf類的成員函數(shù)包括:構(gòu)造函數(shù)設(shè)置級別計算工資(基本工資+津貼+課時補助)顯示教工基本信息#include<iostream.h>#include<fstream.h>#include<string.h>#include<stdlib.h>constintN=10000;typedef
enum
grade{specProf,respProf,norProf,resProf}GRADE;//聲明枚舉類型,包括特聘教授、責(zé)任教授、教學(xué)人員和研究人員classTeacher//聲明抽象基類{protected:
int
tNo;//編號
char*tName;//姓名
GRADEtGrade;//級別
doubletSalary;//工資
staticint
tCount;//教工總數(shù) (續(xù))public:Teacher();~Teacher();virtualvoidsetGrade(GRADE
egrade=norProf){tGrade=egrade;}virtualvoidcalSalary()=0;//純虛函數(shù),計算工資總數(shù)
virtualvoiddispMsg()=0;//純虛函數(shù),顯示教工基本信息};classNorProf:virtualpublicTeacher//聲明教學(xué)人員派生類{protected:doublehours;//每月授課課時數(shù)
doublehourPay;//每課時補助public:
NorProf();voidsetGrade(GRADE);voidcalSalary();voiddispMsg();
}; (續(xù))classResProf:virtualpublicTeacher//聲明研究人員派生類{protected:doubleresMoney;//每月承擔(dān)的科研經(jīng)費總數(shù)
doublerate;//提成public:
ResProf();voidsetGrade(GRADE);voidcalSalary();voiddispMsg();};classSpecProf:public
NorProf,public
ResProf
//聲明特聘教授派生類,該類從教學(xué)人員和研究人員派生{private:doubleallowance;//特聘教授的每月固定津貼public:
SpecProf();voidsetGrade(GRADE); (續(xù))voidcalSalary();voiddispMsg();};classRespProf:public
NorProf,public
ResProf
//聲明責(zé)任教授派生類,該類從教學(xué)人員和研究人員派生{private:doubleallowance;//責(zé)任教授每月固定津貼public:
RespProf();voidsetGrade(GRADE);voidcalSalary();voiddispMsg();};
(續(xù))//類的實現(xiàn)int
Teacher::tCount=N;
Teacher::Teacher():tSalary(800.0),tGrade(norProf){ charname[30];
cout<<"請輸入教師姓名:";
cin>>name;
tName=newchar[strlen(name)+1];
strcpy(tName,name);
tCount++;
tNo=tCount;}
Teacher::~Teacher(){ deletetName;}(續(xù))SpecProf::SpecProf():allowance(10000.0){
hourPay=8.0; rate=0.01;}
voidSpecProf::setGrade(GRADE){
Teacher::setGrade(specProf);}
voidSpecProf::calSalary(){
cout<<"請輸入"<<tName<<"的每月課時數(shù)";
cin>>hours;
cout<<endl;
cout<<"請輸入"<<tName<<"的本月科研經(jīng)費";
cin>>resMoney;
cout<<endl; //特聘教授工資包括基本工資+津貼+課時補助+科研經(jīng)費提成
tSalary=tSalary+allowance+hourPay*hours+rate*resMoney;
cout<<tName<<"是特聘教授,工資是:"<<tSalary<<endl;}(續(xù))voidSpecProf::dispMsg(){
cout<<"特聘教授"<<tName<<",工作證號:"<<tNo <<",級別:"<<tGrade<<",工資:" <<tSalary<<endl;
cout<<"以上是"<<tName<<"的基本信息。"<<endl;}
RespProf::RespProf():allowance(5000.0){
hourPay=8.0;}
voidRespProf::setGrade(GRADE){
Teacher::setGrade(respProf);}(續(xù))
voidRespProf::calSalary(){
cout<<"請輸入"<<tName<<"的每月課時數(shù)";
cin>>hours;
cout<<endl;
//責(zé)任教授工資包括基本工資+津貼+課時補助
tSalary=tSalary+allowance+hourPay*hours;
cout<<tName<<"是責(zé)任教授,工資是:"<<tSalary<<endl;}
voidRespProf::dispMsg(){
cout<<"責(zé)任教授"<<tName<<",工作證號:"<<tNo <<",級別:"<<tGrade<<",工資:" <<tSalary<<endl;
cout<<"以上是"<<tName<<"的基本信息。"<<endl;}(續(xù))NorProf::NorProf():hourPay(8.0){}
voidNorProf::setGrade(GRADE){
Teacher::setGrade(norProf);
}
voidNorProf::calSalary(){
cout<<"請輸入"<<tName<<"的每月課時數(shù)";
cin>>hours;
cout<<endl; //教學(xué)人員工資為基本工資+課時補助
tSalary=tSalary+hours*hourPay;
cout<<tName<<"是教學(xué)人員,工資是:"<<tSalary<<endl;}
(續(xù))voidNorProf::dispMsg(){
cout<<"教學(xué)人員"<<tName<<",工作證號:"<<tNo <<",級別:"<<tGrade<<",工資:"<<tSalary<<endl;
cout<<"以上是"<<tName<<"的基本信息。"<<endl;}ResProf::ResProf():rate(0.01){}
voidResProf::setGrade(GRADE){
Teacher::setGrade(resProf);
}
voidResProf::calSalary(){
cout<<"請輸入"<<tName<<"的每月科研經(jīng)費";
cin>>resMoney; //研究人員工資包括基本工資+科研經(jīng)費提成
tSalary=tSalary+rate*resMoney;
cout<<tName<<"是科研人員,工資是:"<<tSalary<<endl;}(續(xù))
voidResProf::dispMsg(){
cout<<"科研人員"<<tName<<",工作證號:"<<tNo <<",級別:"<<tGrade<<",工資:"<<tSalary<<endl;
cout<<"以上是"<<tName<<"的基本信息。"<<endl;}//文件teacher.cpp結(jié)束
//文件tuser.cpp#include“teacher.h”//主程序intmain(){
SpecProfteacher1;//聲明特聘教授對象
RespProfteacher2;//聲明責(zé)任教授對象
NorProfteacher3;//聲明教學(xué)人員對象
ResProfteacher4;//聲明研究人員對象
Teacher*ptrTeacher;//聲明抽象基類的指針(續(xù))
ptrTeacher=&teacher1;
ptrTeacher->setGrade();
ptrTeacher->calSalary();
ptrTeacher->dispMsg();
ptrTeacher=&teacher2;
ptrTeacher->setGrade();
ptrTeacher->calSalary();
ptrTeacher->dispMsg();
ptrTeacher=&teacher3;
ptrTeacher->setGrade();
ptrTeacher->calSalary();
ptrTeacher->dispMsg();
ptrTeacher=&teacher4;
ptrTeacher->setGrade();
ptrTeacher->calSalary();
ptrTeacher->dispMsg(); return0;}//文件tuser.cpp結(jié)束(續(xù))請輸入教師姓名:liqiang請輸入教師姓名:wanggang請輸入教師姓名:zhanghua請輸入教師姓名:liujian請輸入liqiang的每月課時數(shù)20請輸入liqiang的本月科研經(jīng)費20000liqiang是特聘教授,工資是:11160特聘教授liqiang,工作證號:10001,級別:2,工資:11160以上是liqiang的基本信息。請輸入wanggang的每月課時數(shù)20wanggang是責(zé)任教授,工資是:5960責(zé)任教授wanggang,工作證號:10002,級別:2,工資:5960以上是wanggang的基本信息。請輸入zhanghua的每月課時數(shù)30zhanghua是教學(xué)人員,工資是:1040教學(xué)人員zhanghua,工作證號:10003,級別:2,工資:1040以上是zhanghua的基本信息。請輸入liujian的每月科研經(jīng)費30000liujian是科研人員,工資是:1100科研人員liujian,工作證號:10004,級別:2,工資:1100以上是liujian的基本信息。(續(xù))成員函數(shù)的重載、覆蓋與隱藏
成員函數(shù)的重載、覆蓋(override)與隱藏很容易混淆,C++程序員必須要搞清楚概念,否則錯誤將防不勝防。
成員函數(shù)被重載的特征:(1)相同的范圍(在同一個類中);(2)函數(shù)名字相同;(3)參數(shù)不同;(4
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度建筑工人勞動合同(附創(chuàng)新技術(shù)培訓(xùn)內(nèi)容)
- 二零二五年度國際酒店餐飲業(yè)勞務(wù)供應(yīng)協(xié)議
- 二零二五年度生活垃圾清運與環(huán)保技術(shù)研發(fā)應(yīng)用合同
- 電子商務(wù)平臺代運營服務(wù)協(xié)議
- 采購合同辣椒采購合同
- 音樂課本中的歌曲背后的故事征文
- 專業(yè)保潔服務(wù)合作協(xié)議
- 簡愛人物形象塑造分析:世界名著導(dǎo)讀課程教案
- 人力資源招聘與培訓(xùn)流程說明
- 企業(yè)綠色信用修復(fù)服務(wù)協(xié)議
- 10我們所了解的環(huán)境污染 (教學(xué)設(shè)計)2023-2024學(xué)年統(tǒng)編版道德與法治四年級上冊
- 2025中國煙草/中煙工業(yè)招聘易考易錯模擬試題(共500題)試卷后附參考答案
- 新教科版小學(xué)科學(xué)三年級下冊教案(全冊)
- 2025小學(xué)語文一年級下冊第二單元教學(xué)課件匯編(配套新教材)
- 語文課堂中的多媒體教學(xué)方法研究
- 2025年湖南交通職業(yè)技術(shù)學(xué)院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 小學(xué)生傳統(tǒng)文化教育的家庭學(xué)校社會協(xié)同機制
- 兒童飲食健康指南
- 民用無人機操控員執(zhí)照(CAAC)考試復(fù)習(xí)重點題庫500題(含答案)
- 2025年春新北師大版物理八年級下冊課件 第六章 質(zhì)量和密度 第三節(jié) 密度的測量與應(yīng)用
- 2024-2025學(xué)年成都市高一上英語期末考試題(含答案和音頻)
評論
0/150
提交評論