大連海事大學(xué)C++面向?qū)ο蟮某绦蛟O(shè)計(jì)胡英Chapter8_第1頁(yè)
大連海事大學(xué)C++面向?qū)ο蟮某绦蛟O(shè)計(jì)胡英Chapter8_第2頁(yè)
大連海事大學(xué)C++面向?qū)ο蟮某绦蛟O(shè)計(jì)胡英Chapter8_第3頁(yè)
大連海事大學(xué)C++面向?qū)ο蟮某绦蛟O(shè)計(jì)胡英Chapter8_第4頁(yè)
大連海事大學(xué)C++面向?qū)ο蟮某绦蛟O(shè)計(jì)胡英Chapter8_第5頁(yè)
已閱讀5頁(yè),還剩47頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

評(píng)論

0/150

提交評(píng)論