版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
8.1多態(tài)性概述
8.2虛函數(shù)
8.3抽象類
8.4虛析構(gòu)函數(shù)
8.5綜合實(shí)例
8.6重載、覆蓋和隱藏第8章
多態(tài)與虛函數(shù)一種語(yǔ)言若不支持多態(tài),則不能稱之為面向?qū)ο蟮某绦蛟O(shè)計(jì)語(yǔ)言。本章要討論的多態(tài)性與前面我們介紹的繼承、封裝等一樣,都是面向?qū)ο蟪绦蛟O(shè)計(jì)語(yǔ)言中的重要特征。多態(tài)性與繼承是密不可分的,本章所講的多態(tài)性指在繼承類中與基類同名、同參數(shù)、同類型函數(shù)的不同行為。一般來說,C++語(yǔ)言支持兩種不同類型的多態(tài):編譯時(shí)多態(tài)和運(yùn)行時(shí)多態(tài)。本章討論的內(nèi)容主要集中在運(yùn)行時(shí)多態(tài)及其實(shí)現(xiàn)。多態(tài)就是指不同的對(duì)象接受到相同的消息時(shí)產(chǎn)生不同的響應(yīng)動(dòng)作,即對(duì)應(yīng)相同的函數(shù)名,卻執(zhí)行了不同的函數(shù)體(當(dāng)然,這些函數(shù)體還是要事先定義好,以便調(diào)用)。種把程序標(biāo)示符與和一個(gè)存儲(chǔ)地址相聯(lián)系的過程,稱為聯(lián)編(binding,又譯為綁定)。【
8.1多態(tài)性概述】靜態(tài)聯(lián)編:指這種聯(lián)編在編譯階段完成的,由于聯(lián)編過 程是在程序運(yùn)行前完成的,所以又稱為早 期聯(lián)編。靜態(tài)聯(lián)編能夠?qū)崿F(xiàn)編譯時(shí)多態(tài)。動(dòng)態(tài)聯(lián)編:指這種聯(lián)編要在程序運(yùn)行時(shí)動(dòng)態(tài)進(jìn)行,所以 又稱為晚期聯(lián)編。動(dòng)態(tài)聯(lián)編可以實(shí)現(xiàn)運(yùn)行時(shí) 多態(tài)。要實(shí)現(xiàn)靜態(tài)聯(lián)編,在編譯階段就必須確定標(biāo)示符(如函數(shù)名)和代碼之間的對(duì)應(yīng)關(guān)系。重載多態(tài):是函數(shù)重載。強(qiáng)制轉(zhuǎn)換多態(tài):不同類型的數(shù)據(jù)類型進(jìn)行 混合運(yùn)算時(shí)要進(jìn)行的強(qiáng)制 類型轉(zhuǎn)換。包含多態(tài):指在基類及其派生類族中同名 函數(shù)的不同函數(shù)實(shí)現(xiàn),及其在 運(yùn)行時(shí)的不同響應(yīng)。參數(shù)多態(tài):在后面章節(jié)中進(jìn)行探討。編譯時(shí)多態(tài)和運(yùn)行時(shí)多態(tài)的嚴(yán)格劃分都是通用多態(tài)都是專用多態(tài)【
8.1多態(tài)性概述】支持兩種編譯方式【例8-1】通過基類指針訪問派生類對(duì)象#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通過基類指針訪問派生類對(duì)象【
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ù)成員};
通過基類指針訪問派生類對(duì)象例8-1//類的實(shí)現(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;//聲明指向基類對(duì)象的指針
Derived*ptrDerived=&myDerived;//聲明指向派生類對(duì)象的指針(續(xù))
myBase.display();
ptrBase->display();
myDerived.display();
ptrDerived->display();
ptrBase=&myDerived;//將基類指針指向派生類對(duì)象
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//水果類的聲明及其實(shí)現(xiàn){public:Fruit(){}~Fruit(){}virtualvoiddispFruitName()//用virtual聲明虛函數(shù)dispFruitName(){cout<<″It′sfruitclass!″<<endl;}//虛函數(shù)dispFruitName()在基類中
//的實(shí)現(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()的實(shí)現(xiàn)
voidtaste(){cout<<″It′ssomeacid!″<<endl;}//派生類中虛函數(shù)
//eatFruit()的實(shí)現(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()的實(shí)現(xiàn)
voidtaste(){cout<<″It′ssweet!″<<endl;}//派生類中虛函數(shù)
//eatFruit()的實(shí)現(xiàn)};//主程序開始#include<iostream.h>intmain(){Fruitmyfruit,*ptrfruit;//聲明水果類的對(duì)象及指針
(續(xù))
Applemyapple,*ptrapple;//聲明蘋果類的對(duì)象及指針
Orangemyorange,*ptrorange;//聲明橘子類的對(duì)象及指針
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;//將基類指針指向派生類對(duì)象
ptrfruit->dispFruitName();//執(zhí)行派生類的成員函數(shù)
ptrfruit->taste();
ptrfruit=ptrorange;//將基類指針指向派生類對(duì)象
ptrfruit->dispFruitName();//執(zhí)行派生類的成員函數(shù)
ptrfruit->taste();}//主程序結(jié)束說明:聲明了基類指針,就可以使不同的派生類對(duì)象產(chǎn)生不同的函數(shù)調(diào)用,實(shí)現(xiàn)了程序的運(yùn)行時(shí)多態(tài)。運(yùn)行時(shí)多態(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ù)的語(yǔ)法是正如上例中我們所看到的:
virtual函數(shù)類型函數(shù)名稱(形式參數(shù)表);虛函數(shù)的聲明只能出現(xiàn)在類聲明時(shí)的函數(shù)原型聲明中。在派生類中可以不顯示地聲明為虛函數(shù),系統(tǒng)會(huì)自動(dòng)判別該函數(shù)是虛函數(shù)或者重載函數(shù)。注(續(xù))函數(shù)無法具體實(shí)現(xiàn)(或不必實(shí)現(xiàn))。這樣的函數(shù)可以聲明為純虛函數(shù)。對(duì)于純虛函數(shù),可以不必定義它的函數(shù)體。含有純虛函數(shù)的類被稱為抽象類。設(shè)計(jì)抽象類的目的就是為了多態(tài)地使用它的成員函數(shù),由此為整個(gè)類族規(guī)定統(tǒng)一的接口形式。純虛函數(shù)的語(yǔ)法形式是:
virtual函數(shù)類型函數(shù)名(參數(shù)表)=0;特點(diǎn)是在函數(shù)名及參數(shù)表后面多了一個(gè)“=0”。注一旦在基類中聲明了純虛函數(shù),該基類就成為抽象類,若該類的某個(gè)派生類沒有給出基類中的純虛函數(shù)的全部實(shí)現(xiàn),則該派生類依然是抽象類?!?/p>
8.3抽象類】可以聲明指向抽象類的指針,雖然該指針不能指向任何抽象類的對(duì)象(因?yàn)椴淮嬖?,但可以通過該指針獲得對(duì)派生類成員函數(shù)的調(diào)用。#include<iostream.h>#include<string.h>classFruit//聲明抽象類{public:Fruit(){}~Fruit(){}virtualvoiddispFruitName()=0;//聲明為純虛函數(shù)
virtualvoidtaste()=0;//聲明為純虛函數(shù)};classApple:publicFruit//派生類為非抽象類{ 改進(jìn)后的水果類——抽象類說明:水果本身是一個(gè)抽象的概念。所以可以考慮用抽象類來實(shí)現(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;}//實(shí)現(xiàn)基類
//中的純虛函數(shù)
voidtaste(){cout<<″It′ssomeacid!″<<endl;}//實(shí)現(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;}//實(shí)現(xiàn)基
//類中的純虛函數(shù)
voidtaste(){cout<<″It′ssweet!″<<endl;}//實(shí)現(xiàn)基類中的純虛函
//數(shù)};//主程序#include<iostream.h>intmain(){Fruit*ptrfruit;//聲明指向虛基類的指針
Applemyapple;Orangemyorange;
myapple.setAppleName(″Guoguang″);
myorange.setOrangeName(″Huangyan″);
(續(xù))
ptrfruit=&myapple;//將虛基類指針指向派生類的對(duì)象
ptrfruit->dispFruitName();
ptrfruit->taste();
ptrfruit=&myorange;//將虛基類指針指向派生類對(duì)象
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個(gè)虛函數(shù),dispName(),dispArea()和dispPos()。這些虛函數(shù)在其派生類Circle和Rectangle中獲得不同的實(shí)現(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()//實(shí)現(xiàn)基類中的純虛函數(shù){
cout<<endl;
cout<<″Currentshape′snameisCircle!″<<endl;}voidCircle::dispArea()//實(shí)現(xiàn)基類中的純虛函數(shù){area=3.14*radius*radius;
cout<<endl;
cout<<″Theareaofthecircleis:″<<area<<endl;}voidCircle::dispPos()//實(shí)現(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()//實(shí)現(xiàn)基類中的純虛函數(shù){
cout<<endl;
cout<<″Currentshape′snameisRectangle!″<<endl;}voidRectangle::dispArea()//實(shí)現(xiàn)基類中的純虛函數(shù){area=length*width;
cout<<endl;
cout<<″Theareaoftherectangleis:″<<area<<endl;}voidRectangle::dispPos()//實(shí)現(xiàn)基類中的純虛函數(shù){
cout<<endl;
(續(xù))
cout<<″Therectangle′sleftuppositionis:″<<″(″<<x<<″,″<<y<<″)″<<endl;}//主程序#include<iostream.h>intmain(){Shape*ptrshape;//聲明抽象類指針
Circlecircle1(20,30,30);//聲明派生類Circle的對(duì)象
Rectanglerect1(40,40,80,20);//聲明派生類Rectangle的對(duì)象
circle1.dispName();circle1.dispArea();circle1.dispPos();
ptrshape=&circle1;//抽象類指針指向派生類Circle的對(duì)象
ptrshape->dispName();
ptrshape->dispArea();
ptrshape->dispPos();
(續(xù))
rect1.dispName();rect1.dispArea();rect1.dispPos();
ptrshape=&rect1;//抽象類指針指向派生類Rectangle的對(duì)象
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ù)的過程中,如果派生類中存在動(dòng)態(tài)內(nèi)存分配,并且清理工作是在其析構(gòu)函數(shù)中進(jìn)行的,這時(shí)就需要使用虛析構(gòu)函數(shù)來防止可能的內(nèi)存泄漏。例8-6使用虛析構(gòu)函數(shù)防止內(nèi)存泄漏。#include<iostream.h>
classBase//基類{public: Base() {
bptr=newchar[8];//基類中的動(dòng)態(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];//派生類中的動(dòng)態(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;};//測(cè)試程序intmain(){ Base*b=newDerived; b->disp(); deleteb; return0;}
程序輸出:InBaseConstructor!InDerivedConstructor!InDerived!InDerivedDestructor!InBaseDestructor!現(xiàn)假設(shè)某高校按如下方式確定教師工資:對(duì)于在某一學(xué)科取得突出成就的學(xué)術(shù)帶頭人聘為特聘教授,給予每月10000元的津貼;對(duì)于其他有突出貢獻(xiàn)的教學(xué)科研骨干聘為責(zé)任教授,給予每月5000元的津貼。普通教學(xué)和科研人員則從其教學(xué)課時(shí)和科研經(jīng)費(fèi)中獲得補(bǔ)助。特聘教授和責(zé)任教授原工資待遇不變。根據(jù)上述要求,可以聲明基類為教師(Teacher),該基類包含一些所有教師共有的數(shù)據(jù)比如教師的姓名、級(jí)別、編號(hào)、月工資;該基類的成員函數(shù)中計(jì)算工資、顯示教師的基本信息可以考慮聲明為純虛函數(shù),因?yàn)閷?duì)于抽象的教師類來說,這些成員函數(shù)不具有實(shí)際意義?!?/p>
8.5綜合實(shí)例】
Teacher類的屬性包括: 編號(hào) 姓名 級(jí)別 月工資 教工總數(shù)(靜態(tài)變量)Teacher類的成員函數(shù)包括: 構(gòu)造函數(shù) 析構(gòu)函數(shù)(應(yīng)為虛函數(shù)) 設(shè)置級(jí)別 計(jì)算工資(應(yīng)為虛函數(shù)) 顯示教工基本信息(應(yīng)為虛函數(shù))
從Teacher類可以派生教學(xué)人員類(NorProf)和研究人員類(ResProf):NorProf類從Teacher類派生類,其屬性還包括: 每月授課課時(shí)數(shù) 每課時(shí)補(bǔ)助NorProf類的成員函數(shù)包括: 構(gòu)造函數(shù) 設(shè)置級(jí)別 計(jì)算工資(工資包括基本工資+課時(shí)補(bǔ)助)
顯示教工基本信息ResProf類從Teacher類派生,其屬性還包括:每月承擔(dān)的科研經(jīng)費(fèi)總數(shù) 提成比例ResProf類的成員函數(shù)包括: 構(gòu)造函數(shù) 設(shè)置級(jí)別 計(jì)算工資(工資包括基本工資+科研經(jīng)費(fèi)提成)
顯示教工基本信息特聘教授SpecProf類,該類從教學(xué)人員類NorProf和研究人員類ResProf派生SpecProf類的屬性還包括:每月固定津貼SpecProf類的成員函數(shù)包括:構(gòu)造函數(shù)設(shè)置級(jí)別計(jì)算工資(基本工資+津貼+課時(shí)補(bǔ)助+科研提成)顯示教工基本信息
責(zé)任教授RespProf類,該類從教學(xué)人員類NorProf和研究人員類ResProf派生RespProf類的屬性還包括:每月固定津貼RespProf類的成員函數(shù)包括:構(gòu)造函數(shù)設(shè)置級(jí)別計(jì)算工資(基本工資+津貼+課時(shí)補(bǔ)助)顯示教工基本信息#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;//編號(hào)
char*tName;//姓名
GRADEtGrade;//級(jí)別
doubletSalary;//工資
staticint
tCount;//教工總數(shù) (續(xù))public:Teacher();~Teacher();virtualvoidsetGrade(GRADE
egrade=norProf){tGrade=egrade;}virtualvoidcalSalary()=0;//純虛函數(shù),計(jì)算工資總數(shù)
virtualvoiddispMsg()=0;//純虛函數(shù),顯示教工基本信息};classNorProf:virtualpublicTeacher//聲明教學(xué)人員派生類{protected:doublehours;//每月授課課時(shí)數(shù)
doublehourPay;//每課時(shí)補(bǔ)助public:
NorProf();voidsetGrade(GRADE);voidcalSalary();voiddispMsg();
}; (續(xù))classResProf:virtualpublicTeacher//聲明研究人員派生類{protected:doubleresMoney;//每月承擔(dān)的科研經(jīng)費(fèi)總數(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ù))//類的實(shí)現(xiàn)int
Teacher::tCount=N;
Teacher::Teacher():tSalary(800.0),tGrade(norProf){ charname[30];
cout<<"請(qǐng)輸入教師姓名:";
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<<"請(qǐng)輸入"<<tName<<"的每月課時(shí)數(shù)";
cin>>hours;
cout<<endl;
cout<<"請(qǐng)輸入"<<tName<<"的本月科研經(jīng)費(fèi)";
cin>>resMoney;
cout<<endl; //特聘教授工資包括基本工資+津貼+課時(shí)補(bǔ)助+科研經(jīng)費(fèi)提成
tSalary=tSalary+allowance+hourPay*hours+rate*resMoney;
cout<<tName<<"是特聘教授,工資是:"<<tSalary<<endl;}(續(xù))voidSpecProf::dispMsg(){
cout<<"特聘教授"<<tName<<",工作證號(hào):"<<tNo <<",級(jí)別:"<<tGrade<<",工資:" <<tSalary<<endl;
cout<<"以上是"<<tName<<"的基本信息。"<<endl;}
RespProf::RespProf():allowance(5000.0){
hourPay=8.0;}
voidRespProf::setGrade(GRADE){
Teacher::setGrade(respProf);}(續(xù))
voidRespProf::calSalary(){
cout<<"請(qǐng)輸入"<<tName<<"的每月課時(shí)數(shù)";
cin>>hours;
cout<<endl;
//責(zé)任教授工資包括基本工資+津貼+課時(shí)補(bǔ)助
tSalary=tSalary+allowance+hourPay*hours;
cout<<tName<<"是責(zé)任教授,工資是:"<<tSalary<<endl;}
voidRespProf::dispMsg(){
cout<<"責(zé)任教授"<<tName<<",工作證號(hào):"<<tNo <<",級(jí)別:"<<tGrade<<",工資:" <<tSalary<<endl;
cout<<"以上是"<<tName<<"的基本信息。"<<endl;}(續(xù))NorProf::NorProf():hourPay(8.0){}
voidNorProf::setGrade(GRADE){
Teacher::setGrade(norProf);
}
voidNorProf::calSalary(){
cout<<"請(qǐng)輸入"<<tName<<"的每月課時(shí)數(shù)";
cin>>hours;
cout<<endl; //教學(xué)人員工資為基本工資+課時(shí)補(bǔ)助
tSalary=tSalary+hours*hourPay;
cout<<tName<<"是教學(xué)人員,工資是:"<<tSalary<<endl;}
(續(xù))voidNorProf::dispMsg(){
cout<<"教學(xué)人員"<<tName<<",工作證號(hào):"<<tNo <<",級(jí)別:"<<tGrade<<",工資:"<<tSalary<<endl;
cout<<"以上是"<<tName<<"的基本信息。"<<endl;}ResProf::ResProf():rate(0.01){}
voidResProf::setGrade(GRADE){
Teacher::setGrade(resProf);
}
voidResProf::calSalary(){
cout<<"請(qǐng)輸入"<<tName<<"的每月科研經(jīng)費(fèi)";
cin>>resMoney; //研究人員工資包括基本工資+科研經(jīng)費(fèi)提成
tSalary=tSalary+rate*resMoney;
cout<<tName<<"是科研人員,工資是:"<<tSalary<<endl;}(續(xù))
voidResProf::dispMsg(){
cout<<"科研人員"<<tName<<",工作證號(hào):"<<tNo <<",級(jí)別:"<<tGrade<<",工資:"<<tSalary<<endl;
cout<<"以上是"<<tName<<"的基本信息。"<<endl;}//文件teacher.cpp結(jié)束
//文件tuser.cpp#include“teacher.h”//主程序intmain(){
SpecProfteacher1;//聲明特聘教授對(duì)象
RespProfteacher2;//聲明責(zé)任教授對(duì)象
NorProfteacher3;//聲明教學(xué)人員對(duì)象
ResProfteacher4;//聲明研究人員對(duì)象
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ù))請(qǐng)輸入教師姓名:liqiang請(qǐng)輸入教師姓名:wanggang請(qǐng)輸入教師姓名:zhanghua請(qǐng)輸入教師姓名:liujian請(qǐng)輸入liqiang的每月課時(shí)數(shù)20請(qǐng)輸入liqiang的本月科研經(jīng)費(fèi)20000liqiang是特聘教授,工資是:11160特聘教授liqiang,工作證號(hào):10001,級(jí)別:2,工資:11160以上是liqiang的基本信息。請(qǐng)輸入wanggang的每月課時(shí)數(shù)20wanggang是責(zé)任教授,工資是:5960責(zé)任教授wanggang,工作證號(hào):10002,級(jí)別:2,工資:5960以上是wanggang的基本信息。請(qǐng)輸入zhanghua的每月課時(shí)數(shù)30zhanghua是教學(xué)人員,工資是:1040教學(xué)人員zhanghua,工作證號(hào):10003,級(jí)別:2,工資:1040以上是zhanghua的基本信息。請(qǐng)輸入liujian的每月科研經(jīng)費(fèi)30000liujian是科研人員,工資是:1100科研人員liujian,工作證號(hào):10004,級(jí)別:2,工資:1100以上是liujian的基本信息。(續(xù))成員函數(shù)的重載、覆蓋與隱藏
成員函數(shù)的重載、覆蓋(override)與隱藏很容易混淆,C++程序員必須要搞清楚概念,否則錯(cuò)誤將防不勝防。
成員函數(shù)被重載的特征:(1)相同的范圍(在同一個(gè)類中);(2)函數(shù)名字相同;(3)參數(shù)不同;(4
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 急腹癥護(hù)理課件
- 鉆具租賃合同模板(2篇)
- 閱讀館合伙人合同(2篇)
- 認(rèn)識(shí)平行 課件
- 輸尿管超聲課件
- 幼兒園小班音樂《大樹媽媽》教案
- 西京學(xué)院《網(wǎng)頁(yè)設(shè)計(jì)與制作》2022-2023學(xué)年期末試卷
- 幼兒園語(yǔ)言教育中的談話活動(dòng)第5章
- 西京學(xué)院《單片機(jī)原理及應(yīng)用實(shí)驗(yàn)》2022-2023學(xué)年期末試卷
- 西華師范大學(xué)《中學(xué)教研活動(dòng)組織指導(dǎo)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2023年(輸電專業(yè))安全準(zhǔn)入考試題庫(kù)(附答案)
- 2024年陜西省煤層氣開發(fā)利用有限公司招聘筆試參考題庫(kù)含答案解析
- 心理問題學(xué)生包保制度
- 醫(yī)院數(shù)字化建設(shè)的智能監(jiān)護(hù)與預(yù)警系統(tǒng)
- 移植物抗宿主病科普講座課件
- 俯臥位通氣清醒病人護(hù)理課件
- 鄉(xiāng)鎮(zhèn)普法知識(shí)講座
- 《工業(yè)控制系統(tǒng)》課件
- 常用降壓藥的分類和代表藥及使用注意事項(xiàng)課件
- 網(wǎng)絡(luò)營(yíng)銷基礎(chǔ)策略與工具第3版何曉兵課后參考答案
- 水利水電工程概論課件
評(píng)論
0/150
提交評(píng)論