![C++第八章習(xí)題解答new_第1頁](http://file4.renrendoc.com/view/121102f4e9fd524ba0eb04bb33fb17d7/121102f4e9fd524ba0eb04bb33fb17d71.gif)
![C++第八章習(xí)題解答new_第2頁](http://file4.renrendoc.com/view/121102f4e9fd524ba0eb04bb33fb17d7/121102f4e9fd524ba0eb04bb33fb17d72.gif)
![C++第八章習(xí)題解答new_第3頁](http://file4.renrendoc.com/view/121102f4e9fd524ba0eb04bb33fb17d7/121102f4e9fd524ba0eb04bb33fb17d73.gif)
![C++第八章習(xí)題解答new_第4頁](http://file4.renrendoc.com/view/121102f4e9fd524ba0eb04bb33fb17d7/121102f4e9fd524ba0eb04bb33fb17d74.gif)
![C++第八章習(xí)題解答new_第5頁](http://file4.renrendoc.com/view/121102f4e9fd524ba0eb04bb33fb17d7/121102f4e9fd524ba0eb04bb33fb17d75.gif)
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
第八章繼承與多態(tài)習(xí)題根本概念與根底知識(shí)自測(cè)題填空題8.1.1如果類α繼承了類β,那么類α稱為〔1〕類,而類β稱為〔2〕類?!?〕類的對(duì)象可作為〔4〕類的對(duì)象處理,反過來不行,因?yàn)椤?〕。如果強(qiáng)制轉(zhuǎn)換那么要注意〔6〕。答案:〔1〕基類〔2〕派生類〔3〕派生類〔4〕基類〔5〕派生類有一些新成員〔6〕只能派生類強(qiáng)制轉(zhuǎn)換為基類8.1.2當(dāng)用public繼承從基類派生一個(gè)類時(shí),基類的public成員成為派生類的〔1〕成員,protected成員成為派生類的〔2〕成員,對(duì)private成員是〔3〕。公有派生可以使其類的〔4〕,所以公有派生是主流。答案:〔1〕public成員〔2〕protected成員〔3〕不可訪問〔4〕接口不變8.1.3利用繼承能夠?qū)崿F(xiàn)〔1〕。這種實(shí)現(xiàn)縮短了程序開發(fā)的時(shí)間,VC++中的〔2〕很好地表達(dá)了這一點(diǎn)。答案:〔1〕代碼的復(fù)用〔2〕MFC編程8.1.4一個(gè)派生類只有一個(gè)直接基類的情況稱為〔1〕,而有多個(gè)直接基類的情況稱為〔2〕。繼承表達(dá)了類的〔3〕概念,這在MFC中得到了很好表現(xiàn),MFC中只采用了〔4〕。答案:〔1〕單繼承〔2〕多重繼承〔3〕層次〔4〕單繼承8.1.5C++中多態(tài)性包括兩種多態(tài)性:〔1〕和〔2〕。前者是通過〔3〕實(shí)現(xiàn)的,而后者是通過〔4〕和〔5〕來實(shí)現(xiàn)的。答案:〔1〕編譯時(shí)的〔2〕運(yùn)行時(shí)的〔3〕函數(shù)和運(yùn)算符的重載〔4〕類繼承關(guān)系〔5〕虛函數(shù)8.1.6在基類中將一個(gè)成員函數(shù)說明成虛函數(shù)后,在其派生類中只要〔1〕、〔2〕和〔3〕完全一樣就認(rèn)為是虛函數(shù),而不必再加關(guān)鍵字〔4〕。如有任何不同,那么認(rèn)為是〔5〕而不是虛函數(shù)。除了非成員函數(shù)不能作為虛函數(shù)外,〔6〕、〔7〕和〔8〕也不能作為虛函數(shù)。答案:〔1〕同虛函數(shù)名〔2〕同參數(shù)表〔3〕同返回類型。如基類中返回基類指針,而派生類中返回派生類指針是允許的〔4〕virtual〔5〕重載〔6〕靜態(tài)成員函數(shù)〔7〕內(nèi)聯(lián)函數(shù)〔8〕構(gòu)造函數(shù)8.1.7純虛函數(shù)定義時(shí)在函數(shù)參數(shù)表后加〔1〕,它說明程序員對(duì)函數(shù)〔2〕,其本質(zhì)是將指向函數(shù)體的指針定為〔3〕。答案:〔1〕=0〔2〕不定義〔3〕NULL簡(jiǎn)答題構(gòu)造函數(shù)和析構(gòu)函數(shù)可以繼承嗎?派生類構(gòu)造函數(shù)各局部的執(zhí)行次序是怎樣的?答:構(gòu)造函數(shù)和析構(gòu)函數(shù)不可以繼承。派生類構(gòu)造函數(shù)各局部的執(zhí)行次序是:調(diào)用基類構(gòu)造函數(shù),按它們?cè)谂缮惵暶鞯南群箜樞?,依次調(diào)用。調(diào)用新增成員對(duì)象的構(gòu)造函數(shù),按它們?cè)陬惗x中聲明的先后順序,依次調(diào)用。派生類的構(gòu)造函數(shù)體中的操作。什么叫派生類的同名覆蓋〔override〕?答:如果派生類聲明了一個(gè)和某個(gè)基類成員同名的新成員〔當(dāng)然如是成員函數(shù),參數(shù)表也必須一樣,否那么是重載〕,派生類中的新成員就屏蔽了基類同名成員,類似函數(shù)中的局部變量屏蔽全局變量。稱為同名覆蓋〔override〕。派生類的析構(gòu)函數(shù)中需完成什么任務(wù)?是否要編寫對(duì)基數(shù)和成員對(duì)象的析構(gòu)函數(shù)的調(diào)用?為什么?答:析構(gòu)函數(shù)的功能是作善后工作,析構(gòu)函數(shù)無返回類型也沒有參數(shù),情況比擬簡(jiǎn)單。派生類析構(gòu)函數(shù)定義格式與非派生類無任何差異,不要編寫對(duì)基數(shù)和成員對(duì)象的析構(gòu)函數(shù)的調(diào)用,只要在函數(shù)體內(nèi)把派生類新增一般成員處理好就可以了,因?yàn)閷?duì)新增的成員對(duì)象和基類的善后工作,系統(tǒng)會(huì)自己調(diào)用成員對(duì)象和基類的析構(gòu)函數(shù)來完成。為什么要使用虛基類?怎樣定義虛基類?用一個(gè)實(shí)例來解釋虛基類在其派生類中的存儲(chǔ)方式。答:在多重繼承是有可能出現(xiàn)同一基類的兩個(gè)拷貝,為防止這種情況,可使用虛基類。虛基類〔virtualbaseclass〕定義方式如下:class派生類名:virtual訪問限定符基類類名{...};class派生類名:訪問限定符virtual基類類名{...};virtual關(guān)鍵字只對(duì)緊隨其后的基類名起作用。如下派生:存儲(chǔ)關(guān)系如(b),在職研究生類有兩個(gè)Person拷貝。采用虛基類后存儲(chǔ)關(guān)系如下:采用虛基類后在職研究生類儲(chǔ)存圖StudentGStudentEGStudentPersonStudent新成員GStudent新成員PersonEmployee新成員Person成員EGStudent新成員PersonPersonEmployee在職研究生類只有一個(gè)Person拷貝。簡(jiǎn)單表達(dá)派生類與基類的賦值兼容規(guī)那么。答:但凡基類所能解決的問題,公有派生類都可以解決。在任何需要基類對(duì)象的地方都可以用公有派生類的對(duì)象來代替,這條規(guī)那么稱賦值兼容規(guī)那么。它包括以下情況:派生類的對(duì)象可以賦值給基類的對(duì)象,這時(shí)是把派生類對(duì)象中從對(duì)應(yīng)基類中繼承來的成員賦值給基類對(duì)象。反過來不行,因?yàn)榕缮惖男鲁蓡T無值可賦??梢詫⒁粋€(gè)派生類的對(duì)象的地址賦給其基類的指針變量,但只能通過這個(gè)指針訪問派生類中由基類繼承來的成員,不能訪問派生類中的新成員。同樣也不能反過來做。派生類對(duì)象可以初始化基類的引用。引用是別名,但這個(gè)別名只能包含派生類對(duì)象中的由基類繼承來的成員。在類中定義對(duì)象成員稱為復(fù)合或嵌套,請(qǐng)比照復(fù)合與繼承的異同之處。答:成員對(duì)象是嵌套的概念,使用成員對(duì)象中的成員,只能直接訪問〔對(duì)象名加點(diǎn)號(hào)加成員名〕公有成員。在類的成員函數(shù)中不能直接訪問和處理成員對(duì)象的私有和保護(hù)成員,而要通過成員對(duì)象的接口去間接訪問和處理。某些應(yīng)用中,對(duì)象成員可以代替繼承中的基類。 基類在派生類中只能繼承一個(gè)〔間接基類不在討論之中〕不能同時(shí)安排兩個(gè),否那么成員名即使使用域分辨符也會(huì)發(fā)生沖突,但如果一定要用兩個(gè),只能采用成員對(duì)象。所以采用成員對(duì)象更加靈活。兩者不是對(duì)立的,而是互為補(bǔ)充的。比擬派生與模板各自的優(yōu)點(diǎn)。答:模板追求的是運(yùn)行效率,而派生追求的是編程的效率。通用性是模板庫(kù)的設(shè)計(jì)出發(fā)點(diǎn)之一,這是由泛型算法和函數(shù)對(duì)象等手段到達(dá)的。為了運(yùn)行的效率,類模板是相互獨(dú)立的,即獨(dú)立設(shè)計(jì),沒有使用繼承的思想。對(duì)類模板的擴(kuò)展是采用適配子〔adapter〕來完成的。應(yīng)該說派生類的目標(biāo)之一也是代碼的復(fù)用和程序的通用性,最典型的就是MFC,派生類的優(yōu)點(diǎn)是可以由簡(jiǎn)到繁,逐步深入,程序編制過程中可以充分利用前面的工作,一步步完成一個(gè)復(fù)雜的任務(wù)。是否使用了虛函數(shù)就能實(shí)現(xiàn)運(yùn)行時(shí)的多態(tài)性?怎樣才能實(shí)現(xiàn)運(yùn)行時(shí)的多態(tài)性?答:不是。實(shí)現(xiàn)動(dòng)態(tài)多態(tài)性時(shí),必須使用基類類型的指針變量或引用,使該指針指向該基類的不同派生類的對(duì)象,并通過該指針指向虛函數(shù),才能實(shí)現(xiàn)動(dòng)態(tài)的多態(tài)性。為什么析構(gòu)函數(shù)總是要求說明為虛函數(shù)?答:在基類中及其派生類中都動(dòng)態(tài)分配內(nèi)存空間時(shí),必須把析構(gòu)函數(shù)定義為虛函數(shù),實(shí)現(xiàn)撤消對(duì)象時(shí)的多態(tài)性。根據(jù)賦值兼容規(guī)那么可以用基類的指針指向派生類對(duì)象,如果由該指針撤銷派生類對(duì)象,那么必須將析構(gòu)函數(shù)說明為虛函數(shù),實(shí)現(xiàn)多態(tài)性,自動(dòng)調(diào)用派生類析構(gòu)函數(shù)。我們總是要求將類設(shè)計(jì)成通用的,無論其他程序員怎樣調(diào)用都必須保證不出錯(cuò),所以必須把析構(gòu)函數(shù)定義為虛函數(shù)。什么是抽象類?含有純虛函數(shù)的類是抽象類嗎?答:假設(shè)定義一個(gè)類,它只能用作基類來派生出新的類,而不能用來定義對(duì)象,那么稱為抽象類。含有純虛函數(shù)的類是抽象類。能否不提供源代碼,做到用戶自行把通用的軟件轉(zhuǎn)化為專用軟件?怎樣實(shí)現(xiàn)?答:能不提供源代碼,做到用戶自行把通用的軟件轉(zhuǎn)化為專用軟件。動(dòng)態(tài)聯(lián)編不一定要源代碼,可以只有頭文件和對(duì)象文件的.obj文件。軟件開發(fā)商可在不透露其秘密的情況下發(fā)行.obj形式的軟件,然后由程序員利用繼承機(jī)制,從所購(gòu)得的類中派生出新類。能與軟件開發(fā)商提供的類一起運(yùn)行的軟件也能與派生類一起運(yùn)行,并能通過動(dòng)態(tài)聯(lián)編使用這些派生類中重定義的虛函數(shù)。比方通用的財(cái)務(wù)軟件可以轉(zhuǎn)化為某公司的專用軟件。編程與綜合練習(xí)題請(qǐng)用類的派生方式來組織以下動(dòng)物實(shí)體與概念:動(dòng)物,脊椎動(dòng)物亞門,節(jié)肢動(dòng)物門,魚綱,鳥綱,爬行綱,哺乳綱,昆蟲綱,鯊魚,青魚,海馬,鸚鵡,海鷗,喜鵲,蝙蝠,翼龍,蜻蜓,金龜,揚(yáng)子鱷,袋鼠,金絲猴,虎,蜈蚣,蜘蛛,蝗蟲,知了,螃蟹,蝦。解:動(dòng)物派生出:脊椎動(dòng)物亞門和節(jié)肢動(dòng)物門。脊椎動(dòng)物亞門派生出:魚綱,鳥綱,爬行綱,哺乳綱。魚綱派生出:鯊魚,青魚,海馬。鳥綱派生出:鸚鵡,海鷗,喜鵲。爬行綱派生出:翼龍,金龜,揚(yáng)子鱷。哺乳綱派生出:蝙蝠,袋鼠,金絲猴,虎。節(jié)肢動(dòng)物門派生出:昆蟲綱,蜈蚣〔多足綱〕,蜘蛛〔蜘形綱〕,螃蟹,蝦〔甲殼綱〕。昆蟲綱派生出:蜻蜓,蝗蟲,知了。定義商品類及其多層的派生類。以商品類為基類。第一層派生出服裝類、家電類、車輛類。第二層派生出襯衣類、外衣類、帽子類、鞋子類;空調(diào)類、電視類、音響類;自行車類、轎車類、摩托車類。要求給出根本屬性和派生過程中增加的屬性。解:按題意沒有操作,所以只列出數(shù)據(jù)成員,也不再檢驗(yàn)#include<iostream.h>classCommodity{doubleprice;//價(jià)格charname[20];//商品名charmanufacturer[20];//生產(chǎn)廠家intitems;//數(shù)量};classClothing:publicCommodity{//服裝類chartexture[20];//材料質(zhì)地};classElectric_Appliance:publicCommodity{//家電類enum{Black,White}type;//黑白家電};classVehicle:publicCommodity{//車輛類intwheel_num;//車輪數(shù)量};classShirt:publicClothing{//襯衣類enum{Formal,Casual}Style;//式樣:正式、休閑};classGarment:publicClothing{//外衣類enum{Jacket,Coat}Style;//式樣:夾克、外套};classHat:publicClothing{//帽子類;enum{Winter,Summer,Spring_Autumn}Style;//季節(jié)風(fēng)格};classShoes:publicClothing{//鞋子類enum{Winter,Summer,Spring_Autumn}Style;//季節(jié)風(fēng)格};classAir_Cindition:publicElectric_Appliance{//空調(diào)boolwarm_cool;//是否冷暖floatpower;//功率};classTelevision:publicElectric_Appliance{//電視類intSize;//尺寸boolisColor;//是否彩色};classAcoustics:publicElectric_Appliance{//音響類intspeaker_num;//喇叭數(shù)目floatpower; //功率};classBicycle:publicVehicle{//自行車類intspeed_grades; //調(diào)速級(jí)數(shù)intwheel_size; //輪子大小};classCar:publicVehicle{//轎車類floatvolume; //排氣量boolisSkylight; //是否有天窗intbox_num; //廂數(shù)};classMotorcycle:publicVehicle{//摩托車類floatvolume; //排氣量};voidmain(){}以點(diǎn)〔point〕類為基類,重新定義矩形類和圓類。點(diǎn)為直角坐標(biāo)點(diǎn),矩形水平放置,由左下方的頂點(diǎn)和長(zhǎng)寬定義。圓由圓心和半徑定義。派生類操作判斷任一坐標(biāo)點(diǎn)是在圖形內(nèi),還是在圖形的邊緣上,還是在圖形外。缺省初始化圖形退化為點(diǎn)。要求包括拷貝構(gòu)造函數(shù)。編程測(cè)試類設(shè)計(jì)是否正確。解:#include<iostream.h>#include<math.h>constdoublePI=3.1415926535;classPoint{private:doublex,y;public: Point(){x=0;y=0;} Point(doublexv,doubleyv){x=xv;y=yv;} Point(Point&pt){x=pt.x;y=pt.y;}doublegetx(){returnx;}doublegety(){returny;}doubleArea(){return0;}voidShow(){cout<<"x="<<x<<''<<"y="<<y<<endl;}};classCircle:publicPoint{doubleradius;public: Circle(){radius=0;} Circle(doublexv,doubleyv,doublevv):Point(xv,yv){radius=vv;} Circle(Circle&cc):Point(cc){radius=cc.radius;}//拷貝構(gòu)造函數(shù)doubleArea(){returnPI*radius*radius;}voidShow(){ cout<<"x="<<getx()<<'\t'<<"y="<<gety()<<'\t'<<"radius="<<radius<<endl;//訪問基類的數(shù)據(jù)成員 }intposition(Point&pt){doubledistance=sqrt((getx()-pt.getx())*(getx()-pt.getx()) +(gety()-pt.gety())*(gety()-pt.gety()));doubles=distance-radius;if(s==0)return0;//在圓上elseif(s<0)return-1; //在圓內(nèi)elsereturn1; //在圓外 }};classRectangle:publicPoint{doublewidth,length;public: Rectangle(){width=0;length=0;} Rectangle(doublexv,doubleyv,doublewv,doublelv):Point(xv,xv) { width=wv; length=lv; } Rectangle(Rectangle&rr):Point(rr){ width=rr.width; length=rr.length; }doubleArea(){returnwidth*length;}voidShow(){ cout<<"width="<<width<<'\t'<<"length="<<length<<endl; }intposition(Point&pt);};intRectangle::position(Point&pt){doubles1,s2; s1=(pt.getx()-getx());s2=(pt.gety()-gety());if(((s1==0||s1==width)&&s2<=length)||((s2==0||s2==length)&&s1<=width))return0;//在矩形上elseif(s1<width&&s2<length)return-1; //在矩形內(nèi)elsereturn1; //在矩形外}voidmain(){ Circlecc1(3,4,5),cc2,cc3(cc1); Rectanglert1(0,0,6,8),rt2,rt3(rt1); Pointp1(0,0),p2(6,8),p3(3,3),p4(8,4),p5(8,8); cc1.Show(); cc2.Show(); rt1.Show(); rt2.Show(); cout<<"點(diǎn)p1:"; p1.Show(); cout<<"矩形rt3:"<<'\t'; rt3.Show();switch(rt3.position(p1)){case0:cout<<"在矩形上"<<endl;break;case-1:cout<<"在矩形內(nèi)"<<endl;break;case1:cout<<"在矩形外"<<endl;break; } cout<<"圓cc3:"<<'\t'; cc3.Show();switch(cc3.position(p1)){case0:cout<<"在圓上"<<endl;break;case-1:cout<<"在圓內(nèi)"<<endl;break;case1:cout<<"在圓外"<<endl;break; } cout<<"點(diǎn)p2:"; p2.Show(); cout<<"矩形rt3:"<<'\t'; rt3.Show();switch(rt3.position(p2)){case0:cout<<"在矩形上"<<endl;break;case-1:cout<<"在矩形內(nèi)"<<endl;break;case1:cout<<"在矩形外"<<endl;break; } cout<<"圓cc3:"<<'\t'; cc3.Show();switch(cc3.position(p2)){case0:cout<<"在圓上"<<endl;break;case-1:cout<<"在圓內(nèi)"<<endl;break;case1:cout<<"在圓外"<<endl;break; } cout<<"點(diǎn)p3:"; p3.Show(); cout<<"矩形rt3:"<<'\t'; rt3.Show();switch(rt3.position(p3)){case0:cout<<"在矩形上"<<endl;break;case-1:cout<<"在矩形內(nèi)"<<endl;break;case1:cout<<"在矩形外"<<endl;break; } cout<<"圓cc3:"<<'\t'; cc3.Show();switch(cc3.position(p3)){case0:cout<<"在圓上"<<endl;break;case-1:cout<<"在圓內(nèi)"<<endl;break;case1:cout<<"在圓外"<<endl;break; } cout<<"點(diǎn)p4:"; p4.Show(); cout<<"矩形rt3:"<<'\t'; rt3.Show();switch(rt3.position(p4)){case0:cout<<"在矩形上"<<endl;break;case-1:cout<<"在矩形內(nèi)"<<endl;break;case1:cout<<"在矩形外"<<endl;break; } cout<<"圓cc3:"<<'\t'; cc3.Show();switch(cc3.position(p4)){case0:cout<<"在圓上"<<endl;break;case-1:cout<<"在圓內(nèi)"<<endl;break;case1:cout<<"在圓外"<<endl;break; } cout<<"點(diǎn)p5:"; p5.Show(); cout<<"矩形rt3:"<<'\t'; rt3.Show();switch(rt3.position(p5)){case0:cout<<"在矩形上"<<endl;break;case-1:cout<<"在矩形內(nèi)"<<endl;break;case1:cout<<"在矩形外"<<endl;break; } cout<<"圓cc3:"<<'\t'; cc3.Show();switch(cc3.position(p5)){case0:cout<<"在圓上"<<endl;break;case-1:cout<<"在圓內(nèi)"<<endl;break;case1:cout<<"在圓外"<<endl;break; }}幾何形體的派生關(guān)系如下:對(duì)平面形體有長(zhǎng)和面積,對(duì)立體有外表積和體積,對(duì)幾何圖形基類,周長(zhǎng)、面積和體積應(yīng)怎樣計(jì)算〔用什么函數(shù)〕?對(duì)平面圖形體積怎樣計(jì)算〔用什么函數(shù)〕?對(duì)立體圖形周長(zhǎng)怎么計(jì)算〔用什么函數(shù)〕?要求實(shí)現(xiàn)運(yùn)行時(shí)的多態(tài)性。請(qǐng)編程,并測(cè)試。解:運(yùn)行時(shí)的多態(tài)性要用指針#include<iostream.h>#include<math.h>constdoublePI=3.1415926535;classGeometric_shape{//幾何圖形public:virtualdoubleperimeter()=0; //周長(zhǎng)virtualdoublearea()=0; //面積virtualdoublevolume()=0; //體積virtualvoidShow(){};};classCircle:publicGeometric_shape{//圓doubleradius;public: Circle(){radius=0;} Circle(doublevv){radius=vv;}doubleperimeter(){return2.0*PI*radius;} //周長(zhǎng)doublearea(){returnPI*radius*radius;} //面積doublevolume(){return0;} //體積voidShow(){cout<<"radius="<<radius<<endl;}};classRectangle:publicGeometric_shape{//矩形doublewidth,length;public: Rectangle(){width=0;length=0;}//長(zhǎng)寬 Rectangle(doublewid,doublelen){ width=wid; length=len; } Rectangle(Rectangle&rr){ width=rr.width; length=rr.length; }doubleperimeter(){return2.0*(width+length);} //周長(zhǎng)doublearea(){returnwidth*length;} //面積doublevolume(){return0;} //體積voidShow(){cout<<"width="<<width<<'\t'<<"length="<<length<<endl;}};classTriangle:publicGeometric_shape{//三角形doublea,b,c;public: Triangle(){a=0;b=0;c=0;} Triangle(doublev1,doublev2,doublev3){a=v1;b=v2;c=v3;}doubleperimeter(){returna+b+c;} //周長(zhǎng)doublearea(){doubles=(a+b+c)/2.0;returnsqrt(s*(s-a)*(s-b)*(s-c)); } //面積doublevolume(){return0;} //體積voidShow(){cout<<"a="<<a<<'\t'<<"b="<<b<<'\t'<<"c="<<c<<endl;}};classBox:publicRectangle{//長(zhǎng)方體doubleheight;public: Box(){height=0;} Box(doublewid,doublelen,doubleheg):Rectangle(wid,len){height=heg;}doublevolume(){returnarea()*height;} //體積};classCylinder:publicCircle{//圓柱體doubleheight;public: Cylinder(){height=0;} Cylinder(doublevv,doubleheg):Circle(vv){height=heg;}doublevolume(){returnarea()*height;} //體積};classCone:publicCircle{//圓錐doubleheight;public: Cone(){height=0;} Cone(doublevv,doubleheg):Circle(vv){height=heg;}doublevolume(){returnarea()*height/3;} //體積};classT_pyramid:publicTriangle{//三棱錐doubleheight;public: T_pyramid(){height=0;} T_pyramid(doublev1,doublev2,doublev3,doubleheg):Triangle(v1,v2,v3){height=heg;}doublevolume(){returnarea()*height/3;} //體積};classT_prism:publicTriangle{//三棱柱doubleheight;public: T_prism(){height=0;} T_prism(doublev1,doublev2,doublev3,doubleheg):Triangle(v1,v2,v3){height=heg;}doublevolume(){returnarea()*height;} //體積};voidmain(){ Geometric_shape*gs; Circlecc1(10); Rectanglert1(6,8); Triangletg1(3,4,5);Boxbx1 Cylindercl1(10,3); Conecn1(10,3); T_pyramidtpy1(3,4,5,3); T_prismtpr1(3,4,5,3); cc1.Show();//靜態(tài) cout<<"圓周長(zhǎng):"<<cc1.perimeter()<<'\t'; cout<<"圓面積:"<<cc1.area()<<'\t'; cout<<"圓體積:"<<cc1.volume()<<endl; gs=&rt1;//動(dòng)態(tài) gs->Show(); cout<<"矩形周長(zhǎng):"<<gs->perimeter()<<'\t'; cout<<"矩形面積:"<<gs->area()<<'\t'; cout<<"矩形體積:"<<gs->volume()<<endl; gs=&tg1;//動(dòng)態(tài) gs->Show(); cout<<"三角形周長(zhǎng):"<<gs->perimeter()<<'\t'; cout<<"三角形面積:"<<gs->area()<<'\t'; cout<<"三角形體積:"<<gs->volume()<<endl; gs=&bx1;//動(dòng)態(tài) gs->Show(); cout<<"長(zhǎng)方體底周長(zhǎng):"<<gs->perimeter()<<'\t'; cout<<"長(zhǎng)方體底面積:"<<gs->area()<<'\t'; cout<<"長(zhǎng)方體體積:"<<gs->volume()<<endl; gs=&cl1;//動(dòng)態(tài) gs->Show(); cout<<"圓柱體底周長(zhǎng):"<<gs->perimeter()<<'\t'; cout<<"圓柱體底面積:"<<gs->area()<<'\t'; cout<<"圓柱體體積:"<<gs->volume()<<endl; gs=&cn1;//動(dòng)態(tài) gs->Show(); cout<<"圓錐體底周長(zhǎng):"<<gs->perimeter()<<'\t'; cout<<"圓錐體底面積:"<<gs->area()<<'\t'; cout<<"圓錐體體積:"<<gs->volume()<<endl; gs=&tpy1;//動(dòng)態(tài) gs->Show(); cout<<"三棱錐底周長(zhǎng):"<<gs->perimeter()<<'\t'; cout<<"三棱錐底面積:"<<gs->area()<<'\t'; cout<<"三棱錐體積:"<<gs->volume()<<endl; gs=&tpr1;//動(dòng)態(tài) gs->Show(); cout<<"三棱柱底周長(zhǎng):"<<gs->perimeter()<<'\t'; cout<<"三棱柱底面積:"<<gs->area()<<'\t'; cout<<"三棱柱體積:"<<gs->volume()<<endl;}某公司雇員〔employee〕包括經(jīng)理〔manager〕,技術(shù)人員〔technician〕和銷售員〔salesman〕。開發(fā)部經(jīng)理〔developermanger〕,既是經(jīng)理也是技術(shù)人員。銷售部經(jīng)理〔salesmanager〕,既是經(jīng)理也是銷售員。以employ類為虛基類派生出manager,technician和salesman類;再進(jìn)一步派生出developermanager和salesmanager類。employee類的屬性包括姓名、職工號(hào)、工資級(jí)別,月薪〔實(shí)發(fā)根本工資加業(yè)績(jī)工資〕。操作包括月薪計(jì)算函數(shù)〔pay()〕,該函數(shù)要求輸入請(qǐng)假天數(shù),扣去應(yīng)扣工資后,得出實(shí)發(fā)根本工資。technician類派生的屬性有每小時(shí)附加酬金和當(dāng)月工作時(shí)數(shù),及研究完成進(jìn)度系數(shù)。業(yè)績(jī)工資為三者之積。也包括同名的pay()函數(shù),工資總額為根本工資加業(yè)績(jī)工資。salesman類派生的屬性有當(dāng)月銷售額和酬金提取百分比,業(yè)績(jī)工資為兩者之積。也包括同名的pay()函數(shù),工資總額為根本工資加業(yè)績(jī)工資。manager類派生屬性有固定獎(jiǎng)金額和業(yè)績(jī)系數(shù),業(yè)績(jī)工資為兩者之積。工資總額也為根本工資加業(yè)績(jī)工資。而developermanager類,pay()函數(shù)是將作為經(jīng)理和作為技術(shù)人員業(yè)績(jī)工資之和的一半作為業(yè)績(jī)工資。salesamanager類,pay()函數(shù)那么是經(jīng)理的固定獎(jiǎng)金額的一半,加上部門總銷售額與提成比例之積,這是業(yè)績(jī)工資。編程實(shí)現(xiàn)工資管理。特別注意pay()的定義和調(diào)用方法:先用同名覆蓋,再用運(yùn)行時(shí)多態(tài)。解:#include<iostream.h>#include<string.h>staticintGrades[]={500,600,750,1000,1400,2000,2800,4000};classemployee{protected:char*name;//姓名intID;//職工號(hào)intgrade;//工資級(jí)別doublesalary;//月doublebase_salary;//根本月薪doublecareer_salary;//業(yè)績(jī)工資public: employee(char*=NULL,int=0,int=0);//星號(hào)與等號(hào)間一定要有空格,否那么理解成乘法 ~employee();virtualvoidpay();//月薪計(jì)算函數(shù)voidshow();doublegetsalary(){returnsalary;}doublegetbase_salary(){returnbase_salary;}doublegetcareer_salary(){returncareer_salary;}};employee::employee(char*nn,intid,intgr){ if(nn==NULL)name=NULL;elsename=newchar[strlen(nn)+1]; strcpy(name,nn); ID=id; grade=gr; salary=0;//月薪 base_salary=0;//根本月薪 career_salary=0;//業(yè)績(jī)工資}employee::~employee(){if(name!=NULL)delete[]name;}voidemployee::show(){ cout<<name<<'\t'<<ID<<'\t'<<salary<<endl;}voidemployee::pay(){intdays; cout<<"請(qǐng)輸入請(qǐng)假天數(shù):\n"; cin>>days; base_salary=Grades[grade]*(23-days)/23; career_salary=base_salary/2;//普通員工業(yè)績(jī)工資為根本工資的一半 salary=base_salary+career_salary;}classmanager:virtualpublicemployee{//虛基類protected:doubleprize;//固定獎(jiǎng)金額doublefactor;//業(yè)績(jī)系數(shù)public: manager(char*=NULL,int=0,int=0,double=0);voidpay();};manager::manager(char*nn,intid,intgr,doublepr):employee(nn,id,gr){ prize=pr;//固定獎(jiǎng)金額 factor=0;}voidmanager::pay(){intdays; cout<<"請(qǐng)輸入請(qǐng)假天數(shù):\n"; cin>>days; cout<<"請(qǐng)輸入業(yè)績(jī)系數(shù):\n"; cin>>factor; base_salary=Grades[grade]*(23-days)/23; career_salary=prize*factor*(23-days)/23; salary=base_salary+career_salary;}classtechnician:virtualpublicemployee{protected:doublehours;//月工作時(shí)數(shù)doubleperhour;//每小時(shí)附加酬金doubleshfactor;//研究進(jìn)度系數(shù)public: technician(char*=NULL,int=0,int=0,double=0);voidpay();};technician::technician(char*nn,intid,intgr,doublephr):employee(nn,id,gr){ hours=0; perhour=phr;//每小時(shí)附加酬金 shfactor=0;}voidtechnician::pay(){intdays; cout<<"請(qǐng)輸入請(qǐng)假天數(shù):\n"; cin>>days; cout<<"請(qǐng)輸入研究進(jìn)度系數(shù):\n"; cin>>shfactor; hours=8*(23-days); base_salary=Grades[grade]*(23-days)/23; career_salary=perhour*hours*shfactor*(23-days)/23; salary=base_salary+career_salary;}classsalesman:virtualpublicemployee{protected:doubleamount;//銷售額doubleslfactor;//提成比例public: salesman(char*=NULL,int=0,int=0,double=0);voidpay();};salesman::salesman(char*nn,intid,intgr,doubleslfac):employee(nn,id,gr){ amount=0; slfactor=slfac;//提成比例}voidsalesman::pay(){intdays; cout<<"請(qǐng)輸入請(qǐng)假天數(shù):\n"; cin>>days; cout<<"請(qǐng)輸入銷售額:\n"; cin>>amount; base_salary=Grades[grade]*(23-days)/23; career_salary=amount*slfactor; salary=base_salary+career_salary;}classdevelopermanager:publicmanager,publictechnician{public: developermanager(char*=NULL,intid=0,intgr=0,doublepr=0,doublephr=0);voidpay();};developermanager::developermanager(char*nn,intid,intgr,doublepr,doublephr) :manager(nn,id,gr,pr),technician(nn,id,gr,phr),employee(nn,id,gr){}voiddevelopermanager::pay(){intdays; cout<<"請(qǐng)輸入請(qǐng)假天數(shù):\n"; cin>>days; cout<<"請(qǐng)輸入業(yè)績(jī)系數(shù):\n"; cin>>factor; cout<<"請(qǐng)輸入研究進(jìn)度系數(shù):\n"; cin>>shfactor; hours=8*(23-days); base_salary=Grades[grade]*(23-days)/23;//根本工資 career_salary=perhour*hours*shfactor*(23-days)/23;//技術(shù)人員獎(jiǎng)金 career_salary+=prize*factor*(23-days)/23;//加經(jīng)理業(yè)績(jī)工資 career_salary/=2; salary=base_salary+career_salary;}classsalesmanager:publicmanager,publicsalesman{public: salesmanager(char*=NULL,int=0,int=0,doublepr=0,doubleslfac=0);voidpay();};salesmanager::salesmanager(char*nn,intid,intgr,doublepr,doubleslfac) :manager(nn,id,gr,pr),salesman(nn,id,gr,slfac),employee(nn,id,gr){}voidsalesmanager::pay(){intdays; cout<<"請(qǐng)輸入請(qǐng)假天數(shù):\n"; cin>>days; cout<<"請(qǐng)輸入業(yè)績(jī)系數(shù):\n"; cin>>factor; cout<<"請(qǐng)輸入銷售額:\n"; cin>>amount; base_salary=Grades[grade]*(23-days)/23;//根本工資 career_salary=prize*factor*(23-days)/23;//經(jīng)理業(yè)績(jī)工資 career_salary/=2; career_salary+=amount*slfactor;//加銷售業(yè)績(jī)工資 salary=base_salary+career_salary;}voidmain(){ employeeeml1("張偉",10012,0),*emlp; managermag1("姚婕",20005,4,1000); techniciantec1("王茜",30047,5,10); salesmansal1("朱明",40038,2,0.05); developermanagerdem1("沈俊",50069,6,1500,12); salesmanagersam1("況鐘",60007,3,1000,0.05); eml1.pay(); eml1.show(); mag1.pay(); mag1.show(); tec1.pay(); tec1.show(); sal1.pay(); sal1.show(); emlp=&dem1; emlp->pay(); emlp->show(); emlp=&sam1; emlp->pay(); emlp->show();}為上題添加拷貝構(gòu)造函數(shù),并測(cè)試是否正確。解:#include<iostream.h>#include<string.h>staticintGrades[]={500,600,750,1000,1400,2000,2800,4000};classemployee{protected:char*name;//姓名intID;//職工號(hào)intgrade;//工資級(jí)別doublesalary;//月doublebase_salary;//根本月薪doublecareer_salary;//業(yè)績(jī)工資public: employee(char*=NULL,int=0,int=0);//星號(hào)與等號(hào)間一定要有空格,否那么理解成乘法 employee(employee&); ~employee();virtualvoidpay();//月薪計(jì)算函數(shù)voidshow();doublegetsalary(){returnsalary;}doublegetbase_salary(){returnbase_salary;}doublegetcareer_salary(){returncareer_salary;}};employee::employee(char*nn,intid,intgr){ if(nn==NULL)name=NULL;elsename=newchar[strlen(nn)+1]; strcpy(name,nn); ID=id; grade=gr; salary=0;//月薪 base_salary=0;//根本月薪 career_salary=0;//業(yè)績(jī)工資}employee::employee(employee&emp){if(!=NULL){ name=newchar[strlen()+1]; strcpy(name,); }elsename=NULL; ID=emp.ID; grade=emp.grade; salary=emp.salary;//月薪 base_salary=emp.base_salary;//根本月薪 career_salary=emp.career_salary;//業(yè)績(jī)工資}employee::~employee(){if(name!=NULL)delete[]name;}voidemployee::show(){ cout<<name<<'\t'<<ID<<'\t'<<salary<<endl;}voidemployee::pay(){intdays; cout<<"請(qǐng)輸入請(qǐng)假天數(shù):\n"; cin>>days; base_salary=Grades[grade]*(23-days)/23; career_salary=base_salary/2;//普通員工業(yè)績(jī)工資為根本工資的一半 salary=base_salary+career_salary;}classmanager:virtualpublicemployee{//虛基類protected:doubleprize;//固定獎(jiǎng)金額doublefactor;//業(yè)績(jī)系數(shù)public: manager(char*=NULL,int=0,int=0,double=0); manager(manager&mag);voidpay();};manager::manager(manager&mag):employee(mag){//按賦值兼容規(guī)那么mag可為employee的實(shí)參 prize=mag.prize; factor=mag.factor;}manager::manager(char*nn,intid,intgr,doublepr):employee(nn,id,gr){ prize=pr;//固定獎(jiǎng)金額 factor=0;}voidmanager::pay(){intdays; cout<<"請(qǐng)輸入請(qǐng)假天數(shù):\n"; cin>>days; cout<<"請(qǐng)輸入業(yè)績(jī)系數(shù):\n"; cin>>factor; base_salary=Grades[grade]*(23-days)/23; career_salary=prize*factor*(23-days)/23; salary=base_salary+career_salary;}classtechnician:virtualpublicemployee{protected:doublehours;//月工作時(shí)數(shù)doubleperhour;//每小時(shí)附加酬金doubleshfactor;//研究進(jìn)度系數(shù)public: technician(char*=NULL,int=0,int=0,double=0); technician(technician&);voidpay();};technician::technician(technician&tech):employee(tech){ hours=tech.hours;//月工作時(shí)數(shù) perhour=tech.perhour;//每小時(shí)附加酬金 shfactor=tech.shfactor;//研究進(jìn)度系數(shù)}technician::technician(char*nn,intid,intgr,doublephr):employee(nn,id,gr){ hours=0; perhour=phr;//每小時(shí)附加酬金 shfactor=0;}voidtechnician::pay(){intdays; cout<<"請(qǐng)輸入請(qǐng)假天數(shù):\n"; cin>>days; cout<<"請(qǐng)輸入研究進(jìn)度系數(shù):\n"; hours=8*(23-days); cin>>shfactor; base_salary=Grades[grade]*(23-days)/23; career_salary=perhour*hours*shfactor*(23-days)/23; salary=base_salary+career_salary;}classsalesman:virtualpublicemployee{protected:doubleamount;//銷售額doubleslfactor;//提成比例public: salesman(char*=NULL,int=0,int=0,double=0); salesman(salesman&);voidpay();};salesman::salesman(char*nn,intid,intgr,doubleslfac):employee(nn,id,gr){ amount=0; slfactor=slfac;//提成比例}salesman::salesman(salesman&sale):employee(sale){ amount=sale.amount;//銷售額 slfactor=sale.slfactor;//提成比例}voidsalesman::pay(){intdays; cout<<"請(qǐng)輸入請(qǐng)假天數(shù):\n"; cin>>days; cout<<"請(qǐng)輸入銷售額:\n"; cin>>amount; base_salary=Grades[grade]*(23-days)/23; career_salary=amount*slfactor; salary=base_salary+career_salary;}classdevelopermanager:publicmanager,publictechnician{public: developermanager(char*=NULL,intid=0,intgr=0,doublepr=0,doublephr=0); developermanager(developermanager&);voidpay();};developermanager::developermanager(char*nn,intid,intgr,doublepr,doublephr) :manager(nn,id,gr,pr),technician(nn,id,gr,phr),employee(nn,id,gr){}developermanager::developermanager(developermanager&deman) :manager(deman),technician(deman),employee(deman){}voiddevelopermanager::pay(){intdays; cout<<"請(qǐng)輸入請(qǐng)假天數(shù):\n"; cin>>days; cout<<"請(qǐng)輸入業(yè)績(jī)系數(shù):\n"; cin>>factor; cout<<"請(qǐng)輸入研究進(jìn)度系數(shù):\n"; cin>>shfactor; hours=8*(23-days); base_salary=Grades[grade]*(23-days)/23;//根本工資 career_salary=perhour*hours*shfactor*(23-days)/23;//技術(shù)人員獎(jiǎng)金 career_salary+=prize*factor*(23-days)/23;//加經(jīng)理業(yè)績(jī)工資 career_salary/=2; salary=base_salary+career_salary;}classsalesmanager:publicmanager,publicsalesman{public: salesmanager(char*=NULL,int=0,int=0,doublepr=0,doubleslfac=0); salesmanager(salesmanager&);voidpay();};salesmanager::salesmanager(char*nn,intid,intgr,doublepr,doubleslfac) :manager(nn,id,gr,pr),salesman(nn,id,gr,slfac),employee(nn,id,gr){}salesmanager::salesmanager(salesmanager&salman) :manager(salman),salesman(salman),employee(salman){}voidsalesmanager::pay(){intdays; cout<<"請(qǐng)輸入請(qǐng)假天數(shù):\n"; cin>>days; cout<<"請(qǐng)輸入業(yè)績(jī)系數(shù):\n"; cin>>factor; cout<<"請(qǐng)輸入銷售額:\n"; cin>>amount; base_salary=Grades[grade]*(23-days)/23;//根本工資 career_salary=prize*factor*(23-days)/23;//經(jīng)理業(yè)績(jī)工資 career_salary/=2; career_salary+=amount*slfactor;//加銷售業(yè)績(jī)工資 salary=base_salary+career_salary;}voidmain(){ employeeeml1("張偉",10012,0),*emlp; managermag1("姚婕",20005,4,1000); techniciantec1("王茜",30047,5,10); salesmansal1("朱明",40038,2,0.05); developermanagerdem1("沈俊",50069,6,1500,12); salesmanagersam1("況鐘",60007,3,1000,0.05); eml1.pay(); eml1.show(); mag1.pay(); mag1.show(); tec1.pay(); tec1.show(); sal1.pay(); sal1.show(); emlp=&dem1; emlp->pay(); emlp->show(); emlp=&sam1; emlp->pay(); emlp->show(); cout<<endl; employeeeml0(eml1); managermag0(mag1); techniciantec0(tec1); salesmansal0(sal1); developermanagerdem0(dem1); salesmanagersam0(sam1); eml0.show(); mag0.show(); tec0.show(); sal0.show(); emlp=&dem0; emlp->show(); emlp=&sam0; emlp->show();}采用虛函數(shù)實(shí)現(xiàn)多態(tài)性來建立通用的雙向鏈表派生類。參考【例8.10】和【例7.7】。解://ep8_9.h#include<iostream.h>//首先看結(jié)點(diǎn)組織,采用結(jié)點(diǎn)類加數(shù)據(jù)類classObject{//數(shù)據(jù)類為抽象類public: Object(){}virtualintCompare(Object&)=0;//純虛函數(shù)virtualvoidPrint()=0;//純虛函數(shù)virtual~Object(){}//析構(gòu)函數(shù)可為虛函數(shù),構(gòu)造函數(shù)不行};classDblNode{ Object*info;//數(shù)據(jù)域用指針指向數(shù)據(jù)類對(duì)象 DblNode*llink,*rlink;//前驅(qū)〔左鏈〕、后繼〔右鏈〕指針public: DblNode();//生成頭結(jié)點(diǎn)的構(gòu)造函數(shù)~DblNode();voidLinkinfo(Object*obj);friendclassDblList;//以DblList為友元類,DblList可直接訪問DblNode的私有函數(shù),與結(jié)構(gòu)一樣方便,但更平安};DblNode::DblNode(){info=NULL;llink=rlink=NULL;}DblNode::~DblNode(){ cout<<"刪除結(jié)點(diǎn)類"<<'\t';deleteinfo;//釋放數(shù)據(jù)域}voidDblNode::Linkinfo(Object*obj){info=obj;}//再定義雙鏈表類,選擇常用操作classDblList{ DblNode*head,*current;public: DblList();//構(gòu)造函數(shù),生成頭結(jié)點(diǎn)(空鏈表) ~DblList();//析構(gòu)函數(shù)voidMakeEmpty();//清空鏈表,只余表頭結(jié)點(diǎn)voidInsertFront(DblNode*p);//可用來向前生成鏈表,在表頭插入一個(gè)結(jié)點(diǎn)voidInsertRear(DblNode*p);//可用來向后生成鏈表,在表尾添加一個(gè)結(jié)點(diǎn)voidInsertOrder(DblNode*p);//按升序生成鏈表 DblNode*CreatNode();//創(chuàng)立一個(gè)結(jié)點(diǎn)(孤立結(jié)點(diǎn)) DblNode*DeleteNode(DblNode*p);//刪除指定結(jié)點(diǎn)voidPrintList();//打印鏈表的數(shù)據(jù)域intLength();//計(jì)算鏈表長(zhǎng)度 DblNode*Find(Object&obj);//搜索數(shù)據(jù)域與定值相同的結(jié)點(diǎn),返回該結(jié)點(diǎn)的地址//其它操作};DblList::DblList(){//建立表頭結(jié)點(diǎn) head=newDblNode(); head->rlink=head->llink=head; current=NULL;}DblList::~DblList(){ MakeEmpty();//清空鏈表 cout<<"刪除頭結(jié)點(diǎn):";deletehead;}voidDblList::MakeEmpty(){ DblNode*tempP;while(head->rlink!=head){ tempP=head->rlink; head->rlink=tempP->rlink;//把頭結(jié)點(diǎn)后的第一個(gè)節(jié)點(diǎn)從鏈中脫離 tempP->rlink->llink=head;//處理左指針deletetempP;//刪除(釋放)脫離下來的結(jié)點(diǎn) } current=NULL;//current指針恢復(fù)}voidDblList::InsertFront(DblNode*p){ p->llink=head;//注意次序 p->rlink=head->rlink; head->rlink->llink=p; head->rlink=p;//最后做}voidDblList::InsertRear(DblNode*p){ p->rlink=head;//注意次序 p->llink=head->llink; head->llink->rlink=p; head->llink=p;//最后做}voidDblList::InsertOrder(DblNode*p){if(head==head->llink){ p->llink=head;//注意次序 p->rlink=head->rlink; head->rlink->llink=p; head->rlink=p;//最后做 }else{ current=head->rlink;while(current!=head){if(current->info->Compare(*(p->info))>0)break;//找第一個(gè)比插入結(jié)點(diǎn)大的結(jié)點(diǎn) current=current->rlink; } p->rlink=current;//注意次序 p->llink=current->llink; current->llink->rlink=p; current->llink=p;//最后做 }}DblNode*DblList::CreatNode(){//建立新節(jié)點(diǎn) current=newDblNode();returncurrent;}DblNode*DblList::DeleteNode(DblNode*p){ current=head->rlink;while(current!=head&¤t!=p)current=current->rlink;if(current==head)current=NULL;else{//結(jié)點(diǎn)摘下 p->llink->rlink=p->rlink; p->rlink->llink=p->llink; p->rlink=p->llink=NULL; }returncurrent;}DblNode*DblList::Find(Object&obj){//對(duì)抽象類只能用“引用〞 current=head->rlink;while(current!=head&¤t->info->Compare(obj)!=0)current=current->rlink;if(current==head)current=NULL;returncurrent;//搜索成功返回該結(jié)點(diǎn)地址,不成功返回NULL}voidDblList::PrintList(){ current=head->rlink;while(current!=head){ current->info->Print(); current=current->rlink; } cout<<endl;}DblList::Length(){intcount=0; current=head->rlink;while(current!=head){ count++; current=current->rlink; }returncount;}//ep8_9.cpp#include"ep8_9.h"#include<string.h>classStringObject:publicObject{char*sptr;public: StringObject(); StringObject(char*); ~StringObject();intCompare(Object&);voidPrint();};StringObject::StringObject(){sptr=NULL;}StringObject::StringObject(char*s){ sptr=newchar[strlen(s)+1];//加一不可少,否那么串結(jié)束符沖了其他信息,析構(gòu)會(huì)出錯(cuò)! strcpy(sptr,s);}StringObject::~StringObject(){//虛函數(shù)重定義。撤銷時(shí)可釋放字符串if(sptr)delete[]sptr; cout<<"刪除字符串類"<<endl;}intStringObject::Compare(Object&obj){//虛函數(shù) StringObject&temp=(StringObject&)obj;return(strcmp(sptr,temp.sptr));}voidStringObject::Print(){cout<<sptr<<'\t';}//虛函數(shù)voidmain(){ DblNode*P1; StringObject*p; DblListlist1,list2,list3;char*a[5]={"dog","cat","bear","sheep","ox"},*sp="cat";inti;for(i=0;i<5;i++){ p=newStringObject(a[i]);//建立數(shù)據(jù)對(duì)象 P1=list1.CreatNode();//建立結(jié)點(diǎn) P1->Linkinfo(p);//數(shù)據(jù)對(duì)象連接到結(jié)點(diǎn) list1.InsertFront(P1);//向前生成list1 p=newStringObject(a[i]); P1=list2.CreatNode(); P1->Linkinfo(p); list2.InsertRear(P1);//向后生成list2 } list1.PrintList(); cout<<"list1長(zhǎng)度:"<<list1.Length()<<endl; list2.PrintList(); cout<<"要求刪除的字符串\"cat\""<<endl; p=newStringObject(sp);//為了程序的通用性只能多一次轉(zhuǎn)換 P1=list1.Find(*p);deletep;if(P1!=NULL){ cout<<"刪除cat:"<<endl; P1=list1.DeleteNode(P1);deleteP1; list1.PrintList(); cout<<"list1長(zhǎng)度:"<<list1.Length()<<endl; }elsecout<<"未找到"<<endl; cout<<"清空list1:"<<endl; list1.MakeEmpty();//清空list1 list1.PrintList();for(i=0;i<5;i++){ p=newStringObject(a[i]); P1=list3.CreatNode(); P1->Linkinfo(p); list3.InsertOrder(P1);//升序創(chuàng)立list3 } list3.PrintList(); cout<<"程序結(jié)束:"<<endl;}矩形法〔rectangle〕積分近似計(jì)算公式為:梯形法〔ladder〕積分近似計(jì)算公式為:辛普生法〔simpson〕積分近似計(jì)算公式〔n為偶數(shù)〕為:被積函數(shù)用派生類引入,被積函數(shù)定義為純虛函數(shù)?;悺瞚nteger〕成員數(shù)據(jù)包括:積分上下限b和a;分區(qū)數(shù)n;步長(zhǎng)step=(b-a)/n,積分值result。定義積分函數(shù)integerate()為虛函數(shù),它只顯示提示信息。派生的矩形法類〔rectangle〕重定義integerate(),采用矩形法作積分運(yùn)算。派生的梯形法類〔ladde
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 刺繡機(jī)器轉(zhuǎn)讓合同范例
- 勞動(dòng)法居間合同范例
- 個(gè)月支付 合同范例
- 關(guān)于建筑消防合同范例
- 個(gè)人租房簽合同范例
- 個(gè)人修建酒店合同范本
- 一房?jī)少u房子合同范例
- 中介提成合同范例
- 公司內(nèi)包合同范例
- 借款合同范本有合同編號(hào)
- 農(nóng)產(chǎn)品貯運(yùn)與加工考試題(附答案)
- 學(xué)校財(cái)務(wù)年終工作總結(jié)4
- 2025年人民教育出版社有限公司招聘筆試參考題庫(kù)含答案解析
- 康復(fù)醫(yī)學(xué)治療技術(shù)(士)復(fù)習(xí)題及答案
- 《血管性血友病》課件
- 2025年汽車加氣站作業(yè)人員安全全國(guó)考試題庫(kù)(含答案)
- 2024年司法考試完整真題及答案
- 高三日語一輪復(fù)習(xí)日語助詞「に」和「を」的全部用法課件
- 2024年山東省高考政治試卷真題(含答案逐題解析)
- 2024年執(zhí)業(yè)藥師繼續(xù)教育專業(yè)答案
- 2024-2025學(xué)年人教版七年級(jí)數(shù)學(xué)上冊(cè)期末達(dá)標(biāo)測(cè)試卷(含答案)
評(píng)論
0/150
提交評(píng)論