第6章 虛函數(shù)與多態(tài)性.ppt_第1頁
第6章 虛函數(shù)與多態(tài)性.ppt_第2頁
第6章 虛函數(shù)與多態(tài)性.ppt_第3頁
第6章 虛函數(shù)與多態(tài)性.ppt_第4頁
第6章 虛函數(shù)與多態(tài)性.ppt_第5頁
已閱讀5頁,還剩61頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、1,第二部分 面向?qū)ο蟮某绦蛟O(shè)計(jì),第3章類和對象(一) 第4章類和對象(二) 第5章繼承和派生 第6章虛函數(shù)與多態(tài)性 第7章運(yùn)算符重載 第8章模板 第9章標(biāo)準(zhǔn)模板庫STL 第10章 C+語言的輸入和輸出,2,第6章虛函數(shù)與多態(tài)性,本章要點(diǎn): 多態(tài)性的概念 虛函數(shù)的定義與應(yīng)用 多繼承與虛函數(shù) 純虛函數(shù)與抽象類,3,多態(tài)性(Polymorphism)是面向?qū)ο蟪绦蛟O(shè)計(jì)的一個(gè)非常重要的特性,如果不支持多態(tài)性,C+就不是真正的面向?qū)ο蟪绦蛟O(shè)計(jì)語言。 多態(tài)性指的是不同的對象對于同樣的消息會產(chǎn)生不同的行為,而消息在C+語言中指的就是函數(shù)的調(diào)用,不同的函數(shù)可以具有多種不同的功能,而多態(tài)就是允許用一個(gè)函數(shù)名的

2、調(diào)用來執(zhí)行不同的功能。,4,6.1多態(tài)性概述,6.1.1多態(tài)的類型 多態(tài)性不僅限于C+語言,從面向?qū)ο蠹夹g(shù)的角度來看,多態(tài)性可以分為四類: (1)重載多態(tài),前面學(xué)習(xí)的函數(shù)重載就屬于此概念,運(yùn)算符重載也是重載多態(tài)(第7章將詳細(xì)介紹)。 (2)強(qiáng)制多態(tài),指將一個(gè)變量類型加以變化,以符合一個(gè)函數(shù)或者操作的要求,例如加法運(yùn)算符在進(jìn)行浮點(diǎn)數(shù)與整型數(shù)相加時(shí),首先要對整型數(shù)進(jìn)行強(qiáng)制類型轉(zhuǎn)換為浮點(diǎn)數(shù)再相加的情況,就是強(qiáng)制多態(tài)的實(shí)例。 (3)包含多態(tài),同樣的操作可用于一個(gè)類型及其子類型。包含多態(tài)一般需要進(jìn)行運(yùn)行時(shí)的類型檢查,主要是通過虛函數(shù)來實(shí)現(xiàn)。 (4)參數(shù)多態(tài),采用參數(shù)化模板,通過給出不同的類型參數(shù),使得一

3、個(gè)結(jié)構(gòu)可以適用多種數(shù)據(jù)類型,C+提供的函數(shù)模板和類模板即為典型的參數(shù)多態(tài)(第8章將詳細(xì)介紹)。,5,對于多態(tài)性,一個(gè)要解決的主要問題就是何時(shí)把具體的操作和對象進(jìn)行綁定(binding),也稱聯(lián)編、關(guān)聯(lián),綁定也指的是程序如何為類的對象找到執(zhí)行操作函數(shù)的程序入口的過程。 從系統(tǒng)實(shí)現(xiàn)的角度來看,多態(tài)可以分為兩類: 編譯時(shí)多態(tài) 運(yùn)行時(shí)多態(tài),6,編譯時(shí)多態(tài),指的在程序編譯過程中時(shí)決定同名操作與對象的綁定關(guān)系,也稱靜態(tài)綁定、靜態(tài)聯(lián)編,典型的技術(shù)有函數(shù)重載、運(yùn)算符重載、模板。 由于這種方式是在程序運(yùn)行前就確定了對象要調(diào)用的具體函數(shù),因此程序運(yùn)行的時(shí)候函數(shù)調(diào)用速度快、效率較高。 其缺點(diǎn)是編程不夠靈活。,7,運(yùn)

4、行時(shí)多態(tài),指的是在程序運(yùn)行過程中動態(tài)地確定同名操作與具體對象的綁定關(guān)系,也稱動態(tài)綁定、動態(tài)聯(lián)編等,主要通過使用繼承和虛函數(shù)來實(shí)現(xiàn)。 在編譯、連接過程中確定綁定關(guān)系,程序運(yùn)行之后才能確定。 動態(tài)綁定的優(yōu)點(diǎn)是編程更加靈活、系統(tǒng)易于擴(kuò)展。 由于內(nèi)部增加了實(shí)現(xiàn)虛函數(shù)調(diào)用的機(jī)制,因此要比靜態(tài)綁定的函數(shù)調(diào)用速度慢些。,8,6.1.2 基類指針指向派生類對象,【例6 .1】 函數(shù)重載在多態(tài)性中的應(yīng)用。 /* 06_01.cpp */ #include using namespace std; class Base/基類 public : void Print() cout”Base Class Print.

5、”endl; ;,9,class Derived:public Base /公有派生類 public: void Print() coutPrint(); pb= ,10,Base Class Print. Derived Class Print. Base Class Print. Base Class Print. Base Class Print.,程序的運(yùn)行結(jié)果為:,11,在派生類中重寫了成員函數(shù)Print(),使得不同的對象對同一函數(shù)名的調(diào)用產(chǎn)生了不同的結(jié)果,這就是多態(tài)性的具體表現(xiàn),不過卻是編譯時(shí)多態(tài)。 在程序中可以看到,要想輸出對應(yīng)的字符串,必須明確地指出調(diào)用哪個(gè)對象的成員函數(shù),即

6、通過類的對象調(diào)用,或者通過加類名限定進(jìn)行調(diào)用,如例6.l 中的語句: bl.Print(); /調(diào)用基類對象b1 的Print 函數(shù) d1.Print(); /調(diào)用派生類對象d1 的Print 函數(shù) d1.Base:Print() ; /調(diào)用派生類對象d1中的繼承基類的Print()函數(shù),12,這樣調(diào)用成員函數(shù)的方法是顯示調(diào)用,對于結(jié)構(gòu)復(fù)雜的程序,每個(gè)對象都顯式地寫出要調(diào)用的成員函數(shù)是不切實(shí)際的,往往需要通過對象指針或引用來實(shí)現(xiàn)對成員函數(shù)的調(diào)用。 程序結(jié)果可以看出,在例6.1中定義了一個(gè)基類的指針pb,當(dāng)把這個(gè)指針指向派生類的對象時(shí),希望調(diào)用派生類對象d1的Print()函數(shù),但卻仍然調(diào)用了d

7、1對象包含的基類成員函數(shù)Print()。即本程序希望運(yùn)行結(jié)果為: Base Class Print. Sub Class Print. Base Class Print. Base Class Print. Sub Class Print.,13,6.2 虛函數(shù),6.2.1虛函數(shù)的定義格式 虛函數(shù)必須存在于類的繼承環(huán)境之中才有意義,聲明虛函數(shù)的方法很簡單,只要在基類的成員函數(shù)名前加關(guān)鍵字virtual即可,格式如下: class 類名 virtual 類型 成員函數(shù)名(參數(shù)表); ;,14,定義虛函數(shù)要注意以下的問題: (1)虛函數(shù)必須聲明為類的成員函數(shù),全局函數(shù)及靜態(tài)成員函數(shù)不能聲明為虛函數(shù)

8、; (2)虛函數(shù)與一般成員函數(shù)一樣,可定義在類體內(nèi),也可以定義在類體外; (3)虛函數(shù)的聲明只能出現(xiàn)在類函數(shù)聲明語句中,而不能在成員函數(shù)實(shí)現(xiàn)的部分聲明; (4)構(gòu)造函數(shù)不能聲明為虛函數(shù); (5)析構(gòu)函數(shù)可以是虛函數(shù); (6)當(dāng)一個(gè)基類中聲明了虛函數(shù),則虛函數(shù)特性會在其直接派生類和間接派生類中一直保持下去,并且其派生類不必再用virtual關(guān)鍵字聲明。,15,【例6.2】 虛函數(shù)的定義與應(yīng)用(對例6.1的改進(jìn))。,/* 06_02.cpp */ #include using namespace std; class Base/基類 public : virtual void Print() co

9、ut”Base Class Print.”endl; ; class Derived1:public Base /公有派生類1 public: void Print() cout” Derived1 Class Print.”endl; ;,16,class Derived2:public Base /公有派生類2 public: void Print() coutPrint();/用指針調(diào)用成員函數(shù) rb.Print();/用基類引用調(diào)用基類對象成員函數(shù) pb= ,17,Base Class Print. Base Class Print. Derived1 Class Print. Der

10、ived2 Class Print. Derived1 Class Print.,程序的運(yùn)行結(jié)果為:,18,6.2.2多繼承與虛函數(shù),前面的內(nèi)容介紹了在一個(gè)基類中定義虛函數(shù),然后定義派生類的使用情況,那么在C+多繼承機(jī)制當(dāng)中,虛函數(shù)問題該如何處理呢? 見例6.3中的程序:,19,【例6.3】 多繼承中虛函數(shù)的定義與應(yīng)用。,/* 06_03.cpp */ #include using namespace std; class Base1 public: virtual void TestA() cout”Base1 TestA()”endl; ; class Base2 public: virt

11、ual void TestB() cout”Base2 TestB()”endl; ;,20,class Derived :public Base1, public Base2 public: void TestA() / 重寫基類Base1中的虛函數(shù)TestA() coutTestA(); / 調(diào)用類Derived 的TestA()函數(shù) pB2-TestB(); / 調(diào)用類Derived的TestB()函數(shù) return 0; ,21,Derived TestA() Derived TestB(),程序的運(yùn)行結(jié)果為:,22,圖6.1 多繼承與虛函數(shù),23,【例6.4】 多繼承基類中有同名虛函

12、數(shù)。,/* 06_04.cpp */ #include using namespace std; class Base1 public: virtual void Test() cout”Base1 Test()”endl; ; class Base2 public: virtual void Test() cout”Base2 Test()”endl; ;,24,class Derived :public Base1, public Base2 public: void Test() / 直接重寫虛函數(shù)Test() coutTest(); /用基類指針pB1調(diào)用類Derived 的TestA

13、()函數(shù) pB2-Test(); /用基類指針pB2調(diào)用類Derived的TestB()函數(shù) return 0; ,25,Derived Test() Derived Test(),程序的運(yùn)行結(jié)果為:,26,如果按照例6.4的方式,在派生類中直接重寫虛函數(shù)Test(),則2個(gè)基類的Test()虛函數(shù)都將被覆蓋。 通過兩種基類的指針指向派生類對象并調(diào)用虛函數(shù),就只能有一個(gè)Test()函數(shù)可以調(diào)用,而不是像例6.3那樣有不同的實(shí)現(xiàn)結(jié)果。 為了實(shí)現(xiàn)例6.3中的效果,在派生類Derived中重寫不同基類中相同原型的虛函數(shù)Test(),可以使用下面的方法,不要修改最初的兩個(gè)基類,而是增加兩個(gè)中間類,具體

14、實(shí)現(xiàn)如下:,27,【例6.5】多繼承基類中有同名虛函數(shù)的解決方法。,/* 06_05.cpp */ #include using namespace std; /第一個(gè)基類Base1 class Base1 public: virtual void Test()/虛函數(shù)聲明,函數(shù)實(shí)現(xiàn)略 ; /第二個(gè)基類Base2 class Base2 public: virtual void Test()/虛函數(shù)聲明,函數(shù)實(shí)現(xiàn)略 ;,28,/定義針對Base1的中間類 class MiddleBase1 : public Base1 protected: virtual void Base1_Test()

15、/空的函數(shù)體,什么也不做,留在派生類中實(shí)現(xiàn) virtual void Test() /重寫虛函數(shù)Test() Base1_Test(); ; /定義針對Base2的中間類 class MiddleBase2: public Base2 private: virtual void Base2_Test()/空的函數(shù)體,什么也不做,留在派生類中實(shí)現(xiàn) virtual void Test() /重寫虛函數(shù)Test() Base2_Test(); ; /定義最后的派生類,由兩個(gè)中間類派生而來,29,class Derived :public MiddleBase1, public MiddleBase2

16、 public: / 重寫從中間類繼承下來的虛函數(shù) /重寫中間類的虛函數(shù)Base1_Test(),實(shí)際上是重寫了基類Base1的Test()函數(shù) void Base1_Test () coutTest(); /用基類指針pB1調(diào)用類Derived 的TestA()函數(shù) pB2-Test(); /用基類指針pB2調(diào)用類Derived的TestB()函數(shù) return 0; ,30,Derived TestA() Derived TestB(),程序的運(yùn)行結(jié)果為:,31,圖6.2 中間類的作用,32,6.2.3 虛析構(gòu)函數(shù),析構(gòu)函數(shù)的作用是在對象撤銷之前做必要的“清理現(xiàn)場”的工作。 當(dāng)派生類的對象

17、從內(nèi)存中撤銷時(shí)一般先調(diào)用派生類的析構(gòu)函數(shù),然后再調(diào)用基類的析構(gòu)函數(shù)。但是,如果用new 運(yùn)算符動態(tài)生成一個(gè)派生類的堆對象,并讓基類指針指向該派生類對象。 當(dāng)程序用delete運(yùn)算符通過基類指針刪除派生類對象時(shí),會發(fā)生一種情況:系統(tǒng)會只執(zhí)行基類的析構(gòu)函數(shù),而不執(zhí)行派生類的析構(gòu)函數(shù)。,33,【例6.6】基類中有非虛析構(gòu)函數(shù)時(shí)的執(zhí)行情況。,/* 06_06.cpp */ #include using namespace std; class Base/定義基類Base public: Base()/Base類構(gòu)造函數(shù) coutConstruct Base.endl; Base()/Base類析構(gòu)函數(shù)

18、 coutDeconstruct Base.endl; ;,34,class Derived:public Base /定義公有派生類Derived public: Derived()/Derived類構(gòu)造函數(shù) coutConstruct Derived.endl; Derived()/Derived類析構(gòu)函數(shù) coutDeconstruct Derived.endl; ; int main() /主函數(shù)測試 Base *pb;/定義基類指針 pb=new Derived();/基類指針指向新生成的派生類堆對象 delete pb ; return 1; ,35,Construct Base.

19、 Construct Derived. Destruct Base.,程序的運(yùn)行結(jié)果為:,36,在程序的main()函數(shù)中,pb是基類的指針,指向了一個(gè)派生類Derived的堆對象。希望用delete釋放pb所指向的空間。但運(yùn)行結(jié)果為: Destruct Base. 表示只執(zhí)行了基類Base的析構(gòu)函數(shù),而沒有執(zhí)行派生類Derived的析構(gòu)函數(shù)。如果希望執(zhí)行派生類Derived的析構(gòu)函數(shù),則應(yīng)將基類的析構(gòu)函數(shù)聲明為虛析構(gòu)函數(shù),例如: virtual Base()/Base類析構(gòu)函數(shù) coutDeconstruct Base.endl; 程序其他部分不改動,再運(yùn)行程序,其結(jié)果為: Destruct

20、 Derived. Destruct Base.,37,如果將基類的析構(gòu)函數(shù)聲明為虛函數(shù)時(shí),由該基類所派生的所有派生類的析構(gòu)函數(shù)也都自動成為虛函數(shù),即使派生類的析構(gòu)函數(shù)與基類的析構(gòu)函數(shù)名字不同。 最好把基類的析構(gòu)函數(shù)聲明為虛函數(shù)。這將使所有派生類的析構(gòu)函數(shù)自動成為虛函數(shù)。這樣,如果程序中顯式地用了delete 運(yùn)算符準(zhǔn)備刪除一個(gè)對象,而delete 運(yùn)算符的操作對象用了指向派生類對象的基類指針,則系統(tǒng)會調(diào)用相應(yīng)類的析構(gòu)函數(shù)。,38,虛析構(gòu)函數(shù)的概念和用法很簡單,但它在面向?qū)ο蟪绦蛟O(shè)計(jì)中卻是很重要的技巧。專業(yè)人員一般都習(xí)慣聲明虛析構(gòu)函數(shù),即使基類并不需要析構(gòu)函數(shù),也顯式地定義一個(gè)函數(shù)體為空的虛析

21、構(gòu)函數(shù),以保證在撤銷動態(tài)分配空間時(shí)能得到正確的處理。 構(gòu)造函數(shù)不能聲明為虛函數(shù)。這是因?yàn)樵趫?zhí)行構(gòu)造函數(shù)時(shí)類對象還未完成建立過程,當(dāng)然談不上函數(shù)與類對象的綁定。,39,6 . 3 純虛函數(shù)和抽象類,6.3.1純虛函數(shù) 有時(shí)在基類中將某一成員函數(shù)聲明為虛函數(shù),并不是類本身的要求,而是考慮到派生類的需要,在基類中只定義一個(gè)函數(shù)名,具體功能留給派生類根據(jù)需要去實(shí)現(xiàn)。 因此可以對這種虛函數(shù)只在基類中說明函數(shù)原型,用來定義繼承體系中的統(tǒng)一接口形式,然后在派生類的虛函數(shù)中重新定義具體實(shí)現(xiàn)代碼,而這種基類中的虛函數(shù)就是純虛函數(shù),其聲明一般形式為: virtual 函數(shù)類型 函數(shù)名(參數(shù)表)=0 ;,40,關(guān)于

22、純虛函數(shù),有以下問題需要說明:,(1)純虛函數(shù)沒有函數(shù)體; (2)最后面的“= 0”并不表示函數(shù)返回值為0,它只起形式上的作用,告訴編譯系統(tǒng)“這是純虛函數(shù)”; (3)這是一個(gè)聲明語句,后面應(yīng)有分號; (4)純虛函數(shù)只有函數(shù)的名字而不具備函數(shù)的功能,不能被調(diào)用,它只是通知編譯器在這時(shí)聲明一個(gè)虛函數(shù),留待派生類中定義。在派生類中對此函數(shù)提供定義后,它才能具備函數(shù)的功能,可以被調(diào)用。 如果在一個(gè)類中聲明了純虛函數(shù),而在其派生類中沒有對該函數(shù)定義,則該虛函數(shù)在派生類中仍然為純虛函數(shù)。,41,【例6.7】 分析下列程序的輸出的結(jié)果。,/* 06_07.cpp */ #include using name

23、space std; class Vehicle/定義交通工具類 protected: int pos,speed;/定義成員變量位置和速度 public: Vehicle(int ps=0,int spd=0)/構(gòu)造函數(shù) pos=ps;speed=spd; void SetSpeed(int spd)/設(shè)置速度值 speed=spd; void Show()/顯示交通工具位置 cout”Position at ”posendl; virtual void Run()=0;/聲明純虛函數(shù)Run() ;,42,class Car:public Vehicle/小汽車類 public: void

24、Run()/重寫虛函數(shù)Run() pos+=speed;/位置變化 ; int main()/主函數(shù) Vehicle *pvh; Carcar; pvh= ,43,Position at 0 Position at 5 Position at 10,程序的運(yùn)行結(jié)果為:,程序分析:該程序在基類Vehicle中定義了一個(gè)純虛函數(shù)Run(),其形式如下: virtual void Run()= 0; 程序中用Vehicle類定義的指針指向了一個(gè)Car類的實(shí)例car,然后就可以調(diào)用純虛函數(shù)Run(),從而實(shí)現(xiàn)動態(tài)綁定的效果。,44,6.3.2抽象類,包含有純虛函數(shù)的類是抽象類。 由于抽象類常用作基類,

25、通常稱為抽象基類。 抽象基類的主要作用是: 通過它為一個(gè)類族建立一個(gè)公共的接口,使它們能夠更有效地發(fā)揮多態(tài)特性。 抽象基類聲明了一族派生類的共同接口,而接口的具體實(shí)現(xiàn)代碼,即純虛函數(shù)的函數(shù)體,要由派生類自己定義。,45,抽象類派生出新的類之后,如果派生類給出所有純虛函數(shù)的函數(shù)實(shí)現(xiàn),這個(gè)派生類就可以定義自己的對象,因而不再是抽象類;反之,如果派生類沒有給出全部純虛函數(shù)的實(shí)現(xiàn),這時(shí)的派生類仍然是一個(gè)抽象類。 抽象類不能實(shí)例化,即不能定義一個(gè)抽象類的對象,但是,可以聲明一個(gè)抽象類的指針或引用。通過指針或引用,就可以指向并訪問派生類對象。進(jìn)而訪問派生類的成員,這種訪問是具有多態(tài)特征的。用抽象類實(shí)現(xiàn)多態(tài)

26、性。,46,【例6.8】設(shè)計(jì)一個(gè)抽象類Shape,用來表示形狀的抽象概念,并定義求面積Area()和打印Print()兩個(gè)純虛函數(shù),然后設(shè)計(jì)圓類和矩形兩個(gè)派生類,各自重寫基類中的虛函數(shù)。,/* 06_08.cpp */ #include using namespace std; class Shape protected: double x,y; public: Shape(double a,double b)/構(gòu)造函數(shù) x=a; y=b; virtual double Area()=0;/求面積函數(shù),聲明為虛函數(shù) virtual void Print() =0;/打印輸出形狀信息,聲明為純虛

27、函數(shù) ;,47,/定義圓派生類 class Circle : public Shape private: double radius; /半徑 public: Circle(double r=0,double a=0, double b=0); double Area(); void Print(); ; Circle:Circle(double r, double a, double b) : Shape(a,b) radius=r; double Circle:Area()/實(shí)現(xiàn)求圓形面積 return 3.1416*radius*radius; void Circle:Print() /

28、打印輸出圓形信息 coutCircle Center=(x,y),Radius=radiusendl; ,48,/定義矩形派生類 class Rectangle: public Shape private: double width,height; /矩形寬和高 public: Rectangle(double a=0, double b=0,double w=0,double h=0); double Area(); void Print(); ; Rectangle:Rectangle(double a, double b,double w,double h) : Shape(a,b) w

29、idth=w; height=h; double Rectangle:Area()/實(shí)現(xiàn)求矩形面積 return width*height; void Rectangle:Print() /打印輸出矩形信息 coutRectangle Position=(x,y),Size=( width,height)endl; ,49,int main() Shape *ps1,*ps2; /定義抽象類的指針變量 /Shape s1(5,10);/如果不注釋該語句,編譯程序時(shí)將出錯(cuò) Circle c1(10, 30, 15);/圓對象 Rectangle r1(20,20,100,40);/矩形對象 ps

30、1= ,50,Circle Center=(30,15),Radius=10 Area=314.16 Rectangle Position=(20,20),Size=(100,40) Area=4000,程序的運(yùn)行結(jié)果為:,51,6.4 綜合應(yīng)用舉例,本節(jié)以一個(gè)小型的汽車信息處理程序?yàn)槔?,說明虛函數(shù)、抽象類應(yīng)用。有一個(gè)ASCII文件存儲不同類型汽車信息: 普通汽車Car 卡車Truck 吊車Crane 編寫三個(gè)類實(shí)現(xiàn)這三種汽車類,并且設(shè)計(jì)虛函數(shù)Input()讀入對應(yīng)車型的有關(guān)信息,然后按照指定的格式輸出到屏幕,文件名設(shè)為autos.txt。 文件中的汽車信息如表6.1所示。,52,表6.1 文

31、件中的汽車信息,53,讀入以上文件實(shí)例內(nèi)容后,將以如下格式輸出: Style: Car Manufacturer: Volkswagen Passenger: 5 Style: Truck Manufacturer: GM Passenger: 2 Load: 5 Style: Crane Manufacture: Ford Passenger: 2 Load: 4 Height: 20,54,【例6.9】 汽車信息處理程序。,/* 06_09.cpp */ #include #include using namespace std; /定義汽車抽象基類 class Auto protecte

32、d: string stypename;/類型名 intnpassengers;/乘客數(shù)量 string smanufacturer;/廠商名稱 public: Auto()/構(gòu)造函數(shù) stypename=Auto; npassengers=0; smanufacturer=no manufacturer; ,55,virtual Auto() /虛析構(gòu)函數(shù) /靜態(tài)函數(shù)TrimLine(),用于整理字符串,去掉串尾部換行字符 static void TrimLine(char *sbuf) while(sbuf!=0) if(*sbuf=r|*sbuf=n) *sbuf=0; break; s

33、buf+; virtual bool Input(FILE *fp)=0;/純虛函數(shù)Input(),輸入數(shù)據(jù) virtual void Show()=0; /按照指定的格式輸出車的信息 ;,56,/普通汽車Car類 class Car:public Auto public: Car()/構(gòu)造函數(shù) stypename=Car; /車型名稱為Car /重寫虛函數(shù)Input() bool Input(FILE *fp) char sbuf100; fgets(sbuf,100,fp);/讀入一行字符串(包括換行符) TrimLine(sbuf);/去掉換行符 smanufacturer=sbuf;/

34、生產(chǎn)廠商字符串 fgets(sbuf,100,fp);/再讀一行 npassengers=atoi(sbuf);/atoi()函數(shù)實(shí)現(xiàn)把字符串內(nèi)容轉(zhuǎn)換為整數(shù) return true; ,57,/重寫顯示車信息的虛函數(shù)Show() void Show() coutStyle: stypenameendl; coutManufacturer: smanufacturerendl; coutPassenger: npassengersendl; ;,58,/卡車Truck類,從Car類派生 class Truck:public Car protected: floatfload;/載重量 publi

35、c: Truck()/卡車類構(gòu)造函數(shù) stypename=Truck; /車型名稱 fload=0; /重寫虛函數(shù)Input() bool Input(FILE *fp) char sbuf100; Car:Input(fp);/調(diào)用基類的Input()函數(shù) fgets(sbuf,100,fp);/讀入一行數(shù)據(jù),載重值 fload=atof(sbuf); /atof()函數(shù)實(shí)現(xiàn)把字符串內(nèi)容轉(zhuǎn)換為浮點(diǎn)數(shù) return true; ,59,/重寫顯示卡車信息的虛函數(shù)Show() void Show() Car:Show();/調(diào)用基類的輸出函數(shù)Show() coutLoad: floadendl;

36、/輸出卡車的載重值 ; /吊車Crane類,從Car類派生 class Crane:public Truck protected: floatfheight;/吊車的舉物高度 public: Crane() stypename=Crane; fheight=0; ,60,/重寫虛函數(shù)Input() bool Input(FILE *fp) char sbuf100; Truck:Input(fp); fgets(sbuf,100,fp); fheight=atof(sbuf); return true; /重寫顯示吊車信息的虛函數(shù)Show() void Show() Truck:Show(); coutHeight: fheightendl; ;,61,/主函數(shù) int main() FILE *stream;/定義文件指針 stream=fopen(autos.txt

溫馨提示

  • 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)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論