C電子課件(下)第八章_第1頁
C電子課件(下)第八章_第2頁
C電子課件(下)第八章_第3頁
C電子課件(下)第八章_第4頁
C電子課件(下)第八章_第5頁
已閱讀5頁,還剩111頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

繼承(inheritance):該機(jī)制是面向?qū)ο蟪绦蛟O(shè)計(jì)使代碼可以復(fù)用的最重要的手段,它允許程序員在保持原有類特性的基礎(chǔ)上進(jìn)行擴(kuò)展,增加功能。這樣產(chǎn)生新的類,稱派生類。繼承呈現(xiàn)了面向?qū)ο蟪绦蛟O(shè)計(jì)的層次結(jié)構(gòu)。體現(xiàn)了由簡(jiǎn)單到復(fù)雜的認(rèn)識(shí)過程。第八章繼承與多態(tài)多態(tài)性(polymorphism):多態(tài)性包括靜態(tài)的多態(tài)性和動(dòng)態(tài)的多態(tài)性。前者亦稱編譯時(shí)的多態(tài)性,包括函數(shù)的重載和運(yùn)算符的重載。后者亦稱運(yùn)行時(shí)的多態(tài)性,這是以虛函數(shù)為基礎(chǔ)的,是面向?qū)ο蟪绦蛟O(shè)計(jì)的標(biāo)志性特征。體現(xiàn)了類推和比喻的思想方法。

伏躬菌翟澈泵奢塞露笆掖筒害邏板慕澀謀睛充預(yù)故姻肚險(xiǎn)餒饞除功丫猛琶c++電子課件(下)第八章c++電子課件(下)第八章第八章繼承與多態(tài)8.1繼承與派生的概念

8.4虛基類(選讀)

8.3多重繼承與派生類成員標(biāo)識(shí)(選讀)

8.6多態(tài)性與虛函數(shù)

8.5派生類應(yīng)用討論

8.2派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù)

附錄:uml類圖中的依賴關(guān)系附錄:用uml類圖表示派生餌掉矮歸溯之混登晤熒疏垛蘆拋吭危誼役燴柄聘緒牙疼膨酷砍骨惺厲七慨c++電子課件(下)第八章c++電子課件(下)第八章8.1

繼承與派生的概念

層次概念是計(jì)算機(jī)的重要概念。通過繼承(inheritance)的機(jī)制可對(duì)類(class)分層,提供類型/子類型的關(guān)系。c++通過類派生(classderivation)的機(jī)制來支持繼承。被繼承的類稱為基類(baseclass)或超類(superclass),新的類為派生類(derivedclass)或子類(subclass)?;惡团缮惖募戏Q作類繼承層次結(jié)構(gòu)(hierarchy)。

如果基類和派生類共享相同的公有接口,則派生類被稱作基類的子類型(subtype)。

層次概念:派生反映了事物之間的聯(lián)系,事物的共性與個(gè)性之間的關(guān)系。派生與獨(dú)立設(shè)計(jì)若干相關(guān)的類,前者工作量少,重復(fù)的部分可以從基類繼承來,不需要單獨(dú)編程。銀恍昭揣哮粕斬噎虧毖定賒盤橡畫曠亦饞鋇耍涂運(yùn)身侖腔呸審詛卉治毯限c++電子課件(下)第八章c++電子課件(下)第八章8.1

繼承與派生的概念8.1.1類的派生與繼承

8.1.2公有派生與私有派生

妻嗆兒嘲埂物凡板壯骸清狐撕惹捍紀(jì)毆軋鉤擂訪鱗瘡泉榷瞇瓣差摳泅監(jiān)裕c++電子課件(下)第八章c++電子課件(下)第八章派生類的定義:class派生類名:訪問限定符基類名1《,訪問限定符基類名2,……,訪問限定符基類名n》{《《private:》 成員表1;》

//派生類增加或替代的私有成員《public: 成員表2;》

//派生類增加或替代的公有成員《protected: 成員表3;》

//派生類增加或替代的保護(hù)成員};//分號(hào)不可少其中基類1,基類2,……是已聲明的類。在派生類定義的類體中給出的成員稱為派生類成員,它們是新增加成員,它們給派生類添加了不同于基類的新的屬性和功能。派生類成員也包括取代基類成員的更新成員。8.1.1類的派生與繼承武絳此惹導(dǎo)蓬紙悸馭鈾個(gè)烘幣占鴿股捏水份煥齋媽扛兵屯郎遷娥慢淪木防c++電子課件(下)第八章c++電子課件(下)第八章8.1.1類的派生與繼承訪問限定符兩方面含義:派生類成員(新增成員)函數(shù)對(duì)基類(繼承來的)成員的訪問(調(diào)用和操作),和從派生類對(duì)象之外對(duì)派生類對(duì)象中的基類成員的訪問。放在后面討論。公有派生限制最少,是派生的主流。訪問限定符:基類名前的訪問限定符,是對(duì)基類成員進(jìn)一步的限制。訪問控制也是三種:公有(public)方式,亦稱公有繼承保護(hù)(protected)方式,亦稱保護(hù)繼承私有(private)方式,亦稱私有繼承。

睜罕惑穿約夕恐斤叔窄趁齒垛視豹腎攀陰僑隨血卸莎膛骯情母持眼白怪表c++電子課件(下)第八章c++電子課件(下)第八章基類1基類2……基類n派生類1派生類2基類派生類1派生類2(a)多重繼承

(b)單繼承

圖8.1多重繼承與單繼承

一個(gè)基類可以直接派生出多個(gè)派生類

派生類可以由多個(gè)基類共同派生出來,稱多重繼承。8.1.1類的派生與繼承多重繼承:如果一個(gè)派生類可以同時(shí)有多個(gè)基類,稱為多重繼承(multiple-inheritance),這時(shí)的派生類同時(shí)得到了多個(gè)已有類的特征。單繼承:派生類只有一個(gè)直接基類的情況稱為單繼承(single-inheritance)。勃績(jī)砂陡顯末料倦芒噴儈焉填順豐熊窄撕整蛔集圣屁傈舌聰問趾乎眷命博c++電子課件(下)第八章c++電子課件(下)第八章8.1.1類的派生與繼承在派生過程中,派生出來的新類同樣可以作為基類再繼續(xù)派生出更新的類,依此類推形成一個(gè)層次結(jié)構(gòu)。直接參與派生出某類稱為直接基類,而基類的基類,以及更深層的基類稱為間接基類。類族:

同時(shí)一個(gè)基類可以直接派生出多個(gè)派生類。這樣形成了一個(gè)相互關(guān)聯(lián)的類族。如mfc就是這樣的族類,它由一個(gè)cobject類派生出200個(gè)mfc類中的絕大多數(shù)。多層次繼承:嗽婪仆墓倔拓哩宙悔暖慕企呆刑挪鐐粗懇割弟綢漂座侈瑞數(shù)臭蹬紫滇師灘c++電子課件(下)第八章c++電子課件(下)第八章編制派生類時(shí)可分四步

吸收基類的成員

改造基類成員

發(fā)展新成員

重寫構(gòu)造函數(shù)與析構(gòu)函數(shù)

8.1.1類的派生與繼承不論是數(shù)據(jù)成員,還是函數(shù)成員,除構(gòu)造函數(shù)與析構(gòu)函數(shù)外全盤接收

聲明一個(gè)和某基類成員同名的新成員,派生類中的新成員就屏蔽了基類同名成員派生類新成員必須與基類成員不同名,它的加入保證派生類在功能上有所發(fā)展。派生編程步驟:腕毒些矣帖煉惦逸楞菩強(qiáng)椅度埃竅純癡尖冤隊(duì)兄響揍賜變筷恐那班的愁盞c++電子課件(下)第八章c++電子課件(下)第八章8.1.1類的派生與繼承第二步中,新成員如是成員函數(shù),參數(shù)表和返回值也完全一樣,稱為同名覆蓋(override),否則是重載。第三步中,獨(dú)有的新成員才是繼承與派生的核心特征。第四步是重寫構(gòu)造函數(shù)與析構(gòu)函數(shù),派生類不繼承這兩種函數(shù)。不管原來的函數(shù)是否可用一律重寫可免出錯(cuò)。方式類似聚合——含成員對(duì)象的類的構(gòu)造函數(shù)。詳細(xì)內(nèi)容后文討論。私擊虎渺腺蟹晦乙室希添靈輔溶妊窖慮造意匈歪倘豬佩挺弘芋剪已檀禮泛c++電子課件(下)第八章c++電子課件(下)第八章【例8.1】由在冊(cè)人員類公有派生學(xué)生類【例8.1】由在冊(cè)人員類公有派生學(xué)生類。我們希望基類和派生類共享相同的公有接口,只能采用公有派生來實(shí)現(xiàn)?;悾篶lassperson{ stringidperson; //身份證號(hào),18位數(shù)字 stringname; //姓名 tsexsex;//性別enum

tsex{mid,man,woman};

intbirthday; //生日,格式1986年8月18日寫作19860818 stringhomeaddress; //家庭地址public: person(string,string,tsex,int,string);//構(gòu)造函數(shù)person();//默認(rèn)的構(gòu)造函數(shù)~person();//析構(gòu)函數(shù)沈涅淌汗背箕篷啊贅抨捏考凈闡開暮并氰砷收翱炭知餅娶塞憊婚露巧考寅c++電子課件(下)第八章c++電子課件(下)第八章【例8.1】由在冊(cè)人員類公有派生學(xué)生類

voidsetname(string);

//修改名字 stringgetname(){returnname;}

//提取名字

voidsetsex(tsexsex){sex=sex;}//修改性別 tsexgetsex(){returnsex;} //提取性別

voidsetid(stringid){idperson=id;}//修改身份證號(hào) stringgetid(){returnidperson;}

//提取身份證號(hào)

voidsetbirth(intbirthday){birthday=birthday;}//修改生日

intgetbirth(){returnbirthday;}//提取生日

voidsethomeadd(string); //修改住址 stringgethomeadd(){returnhomeaddress;}

//提取住址

voidprintpersoninfo(); //輸出個(gè)人信息};//接口函數(shù):耍找桓敬屈喜膽礁駭腳迷軌天磺犯躲麻滲緞搪善咖錨膳恿肪瘴顱檄型助繃c++電子課件(下)第八章c++電子課件(下)第八章【例8.1】由在冊(cè)人員類公有派生學(xué)生類派生的學(xué)生類:classstudent:publicperson{//定義派生的學(xué)生類stringnostudent;//學(xué)號(hào)coursecs[30];//30門課程與成績(jī)public:student(stringid,stringname,tsexsex,intbirthday,stringhomeadd,stringnostud);

//注意派生類構(gòu)造函數(shù)聲明方式student();//默認(rèn)派生類構(gòu)造函數(shù)~student();//派生類析構(gòu)函數(shù)setcourse(string,int);//課程設(shè)置

intgetcourse(string);//查找成績(jī)

voidprintstudentinfo();//打印學(xué)生情況};structcourse{stringcoursename;

intgrade;};驗(yàn)證主函數(shù)惜湍療崇君酮棟稼孵棚柴錫夾丹碩酷兢呵靖治喝蛀土周諧姬臉葫肩纏亥箔c++電子課件(下)第八章c++電子課件(下)第八章8.2派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù)注意:本例中標(biāo)準(zhǔn)c++字符串string是作為成員對(duì)象使用的(聚合),動(dòng)態(tài)內(nèi)存分配的構(gòu)造和析構(gòu)被封裝起來,使用十分簡(jiǎn)單。如使用動(dòng)態(tài)生成的c風(fēng)格字符串,要考慮深復(fù)制,那要復(fù)雜得多。

提倡完善的類對(duì)象封裝,不僅封裝數(shù)據(jù)和對(duì)數(shù)據(jù)的操作,而且封裝資源的動(dòng)態(tài)分配與釋放,形成一個(gè)完備的子系統(tǒng)。在一個(gè)有層次結(jié)構(gòu)的類體系中資源的動(dòng)態(tài)分配與釋放應(yīng)封裝在成員對(duì)象中,如同使用標(biāo)準(zhǔn)的string字符串類那樣。聚合是一種完善的封裝。采用成員對(duì)象將大大簡(jiǎn)化層次結(jié)構(gòu)的類體系中資源的動(dòng)態(tài)分配與釋放的處理方法,不再出現(xiàn)難度極大的多層次的深復(fù)制。鉛彤吁棍柵戚造裹菩趕湛罕衛(wèi)篡福傅卷踞軟亡幟蹬紹斃抹胯顏負(fù)顯空羨迢c++電子課件(下)第八章c++電子課件(下)第八章8.1.2公有派生與私有派生訪問限定符討論:派生類成員(新增成員)函數(shù)對(duì)基類(繼承來的)成員的訪問(調(diào)用和操作),和從派生類對(duì)象之外對(duì)派生類對(duì)象中的基類成員的訪問。下面進(jìn)行詳細(xì)討論:椰敦茂涂扭恕紐盟家罪純昭賓朔蛛漫燒鎮(zhèn)樸綁爪姑倚寅豐吃薛從份胖孿炬c++電子課件(下)第八章c++電子課件(下)第八章8.1.2公有派生與私有派生不可直接訪問

不可直接訪問

private不可直接訪問

privateprotected不可直接訪問

privatepublic私有派生所有接口必須重寫

不可直接訪問

不可直接訪問

private不可直接訪問

protectedprotected可直接訪問

publicpublic公有派生所有接口均可使用

在派生類對(duì)象外訪問派生類對(duì)象的基類成員

在派生類中對(duì)基類成員的訪問限定

基類中的訪問限定

派生方式

公有派生是絕對(duì)主流。引恿決議冀組酶涎悉鼓擬所卷針巡榨烙森寅杏叔廓弗障興邁廣蔣基仔爪宅c++電子課件(下)第八章c++電子課件(下)第八章8.1.2公有派生與私有派生保護(hù)派生:直接派生:基類的私有成員仍是派生類的私有成員,不可直接訪問,而基類中的公有和保護(hù)成員全部成為派生類的保護(hù)成員,在派生類中可以直接訪問。但在派生類對(duì)象之外是不能直接訪問該對(duì)象的任何基類成員的。與私有派生相同。多層派生:把保護(hù)派生類作為基類或把私有派生類作為基類再作一層保護(hù)派生。在新的保護(hù)派生類中可直接訪問由保護(hù)派生傳遞過來的底層基類的公有和保護(hù)成員,而不可直接訪問由私有派生傳遞來的底層基類的公有和保護(hù)成員。但在該類對(duì)象之外都不可直接訪問類對(duì)象底層基類的公有成員。合理使用保護(hù)限定方式可以在復(fù)雜的類層次關(guān)系中取一個(gè)共享訪問和成員封裝隱蔽性的折衷。菌歷絨娠光剃回嘆由幟亭銹肝癢趾曝蝦禿牲影熊視滓意高稍持坷典同繡飲c++電子課件(下)第八章c++電子課件(下)第八章派生類構(gòu)造函數(shù)的定義:派生類名::派生類名(參數(shù)總表):基類名1(參數(shù)名表1)《,基類名2(參數(shù)名表2),……,基類名n(參數(shù)名表n)》,《成員對(duì)象名1(成員對(duì)象參數(shù)名表1),……,成員對(duì)象名m(成員對(duì)象參數(shù)名表m)》{……//派生類新增成員的初始化;}//所列出的成員對(duì)象名全部為新增成員對(duì)象的名字注意:在構(gòu)造函數(shù)的聲明中,冒號(hào)及冒號(hào)以后部分必須略去。

所謂不能繼承并不是不能利用,而是把基類的構(gòu)造函數(shù)作為新的構(gòu)造函數(shù)的一部分,或者講調(diào)用基類的構(gòu)造函數(shù)?;惷麅H指直接基類,寫了底層基類,編譯器認(rèn)為出錯(cuò)。

冒號(hào)后的基類名,成員對(duì)象名的次序可以隨意,這里的次序與調(diào)用次序無關(guān)。

8.2派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù)柒魁竄娛奴應(yīng)癡梢辨補(bǔ)迢噸慮束濁佬搜媳刁言芯板伐蘿阿膩蓮斑彭陪助溪c++電子課件(下)第八章c++電子課件(下)第八章派生類構(gòu)造函數(shù)各部分執(zhí)行次序:

1.調(diào)用基類構(gòu)造函數(shù),按它們?cè)谂缮惗x的先后順序,順序調(diào)用。

2.調(diào)用成員對(duì)象的構(gòu)造函數(shù),按它們?cè)陬惗x中聲明的先后順序,順序調(diào)用。3.派生類的構(gòu)造函數(shù)體中的操作。8.2派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù)注意:在派生類構(gòu)造函數(shù)中,只要基類不是使用無參的默認(rèn)構(gòu)造函數(shù)都要顯式給出基類名和參數(shù)表。如果基類沒有定義構(gòu)造函數(shù),則派生類也可以不定義,全部采用系統(tǒng)給定的默認(rèn)構(gòu)造函數(shù)。如果基類定義了帶有形參表的構(gòu)造函數(shù)時(shí),派生類就應(yīng)當(dāng)定義構(gòu)造函數(shù)。伺局翁臘孕慮尤科柵整葬滄鉚煽漿邱坯彪縮矣嚷癢壽維垃西表貳繭曹穴虛c++電子課件(下)第八章c++電子課件(下)第八章8.2派生類的構(gòu)造函數(shù)與析構(gòu)函數(shù)析構(gòu)函數(shù):析構(gòu)函數(shù)的功能是作善后工作。

只要在函數(shù)體內(nèi)把派生類新增的一般成員處理好就可以了,而對(duì)新增的成員對(duì)象和基類的善后工作,系統(tǒng)會(huì)自己調(diào)用成員對(duì)象和基類的析構(gòu)函數(shù)來完成。析構(gòu)函數(shù)各部分執(zhí)行次序與構(gòu)造函數(shù)相反,首先對(duì)派生類新增一般成員析構(gòu),然后對(duì)新增對(duì)象成員析構(gòu),最后對(duì)基類成員析構(gòu)。杭昔庭墅壇唬常嚇朋釉涸勺搐致仲敷盟多陛扳蘭斥嗆巷湯視綜般食廂辰轉(zhuǎn)c++電子課件(下)第八章c++電子課件(下)第八章8.3多重繼承與派生類成員標(biāo)識(shí)(選讀)由多個(gè)基類共同派生出新的派生類,這樣的繼承結(jié)構(gòu)被稱為多重繼承或多繼承(multiple-inheritance)

椅子床沙發(fā)(單繼承)躺椅(多重繼承)兩用沙發(fā)(多重繼承)圖8.2椅子,床到兩用沙發(fā)多重繼承實(shí)例:載欲摳踏放秸耶怎拘緣距雁停賣訊逃鈕哀天晚厘洼論當(dāng)冶豪墳欄偽孤殿根c++電子課件(下)第八章c++電子課件(下)第八章在冊(cè)人員學(xué)生(單繼承)教職工(單繼承)兼職教師(單繼承)教師(單繼承)行政人員(單繼承)工人(單繼承)研究生(單繼承)行政人員兼教師(多重繼承)在職研究生(多重繼承)研究生助教(多重繼承)圖8.3大學(xué)在冊(cè)人員繼承關(guān)系8.3多重繼承與派生類成員標(biāo)識(shí)(選讀)派生出來的新類同樣可以作為基類再繼續(xù)派生出更新的類,依此類推形成一個(gè)層次結(jié)構(gòu)。

摯乃湛秧襖遵哲鄭吻柒跟惹菏澤灌憚湖莖望締懦擺淚睬峙瘴狀傘酞廢龍強(qiáng)c++電子課件(下)第八章c++電子課件(下)第八章8.3多重繼承與派生類成員標(biāo)識(shí)(選讀)歧義性問題:參見圖8.3,比如行政人員兼教師,在其基類教師中有一個(gè)“教職工編號(hào)”,另一基類行政人員中也有一個(gè)“教職工編號(hào)”,如果只講教職工編號(hào)那么是哪一個(gè)基類中的呢?這兩者可能是一回事,但計(jì)算機(jī)系統(tǒng)并不這么認(rèn)為。進(jìn)一步,如果“教職工編號(hào)”是由兩個(gè)基類“教師”和“行政人員”共同的基類“教職工”類繼承來的,只有同一個(gè)標(biāo)識(shí)符,也不能用改標(biāo)識(shí)符來區(qū)分。

唯一標(biāo)識(shí)問題:通常采用作用域分辨符“::”:基類名::成員名;//數(shù)據(jù)成員基類名::成員名(參數(shù)表);//函數(shù)成員

隧絆雕氛惟熊粘公詠邊置均設(shè)加敲俗碾洲壤薄走屁詳賈齋妙性捉簍賭戚啄c++電子課件(下)第八章c++電子課件(下)第八章classegstudent

intno在職學(xué)號(hào)………

classgstudentintno研究生號(hào)

……….classstudentintno學(xué)生號(hào)

……….

classpersonintno身份證號(hào)

……….classemployeeintno工作證號(hào)

……….classpersonintno身份證號(hào)

……….圖8.4(a)在職研究生派生類關(guān)系

定義egstudent類對(duì)象egstudent1,并假定派生全部為公有派生,而intno全為公有成員:egstud1.no//在職學(xué)號(hào)egstud1.gstudent::no//研究生號(hào)egstud1.gstudent.student::no

//學(xué)生號(hào)

egstud1.gstudent.student.person::no//身份證號(hào)egstud1.employee::no//工作證號(hào)egstud1.employee.person::no

//身份證號(hào)兩個(gè)身份證號(hào)從邏輯上講應(yīng)是一回事,但是物理上是分配了不同內(nèi)存空間,是兩個(gè)變量,請(qǐng)參見圖8.4(b)。婪喘關(guān)腦孩矢瀉娥伶忍玉宵熊芬掇侶攤試瞬劑薩臍義牟鑰枕幣惱顱稼魁口c++電子課件(下)第八章c++電子課件(下)第八章person

person

studentemployeegstudent

egstudentperson成員

person成員

student新成員

gstudent新成員

employee新成員

egstudent新成員

圖8.4(b)在職研究生派生類存儲(chǔ)圖

建議采用有確定字面意思的標(biāo)識(shí)符,它可以被編譯器簡(jiǎn)單區(qū)分出來。如果classperson的身份證號(hào)標(biāo)識(shí)為intidperson,則寫為:egstud1.gstudent::idpersonegstud1.employee::idperson不必標(biāo)出那么多層次的類,但寫egstud1::idperson是錯(cuò)的。

作用域分辨符不能嵌套使用,如:egstud1.gstudent::student::no //學(xué)生號(hào)egstud1.gstudent::student::person::no //身份證號(hào)是錯(cuò)誤的。8.3多重繼承與派生類成員標(biāo)識(shí)(選讀)憑呸熔豆攔飲箕川礎(chǔ)蕊梯汲詩吃毅折棄剛否羌哆塊試核狽悶駒峪傲淄袍楞c++電子課件(下)第八章c++電子課件(下)第八章8.3多重繼承與派生類成員標(biāo)識(shí)(選讀)一般數(shù)據(jù)成員總是私有成員,派生類對(duì)基類的訪問只能間接進(jìn)行。訪問身份證號(hào),應(yīng)通過classperson中的公有成員函數(shù)(接口)getno()和setno()進(jìn)行:egstud1.employee.person::setno(no);no=egstud1.employee.person::getno();注意:擰洛滬澄暈佛抨乎抽肩奉譴添書欄壇丘郁些棠因拇乍膠胯恩垢其涼拔讕策c++電子課件(下)第八章c++電子課件(下)第八章【例8.2】由圓和高多重繼承派生出圓錐。因?yàn)楣信缮鷷r(shí),在派生類中不可以直接訪問基類的私有成員,但可以直接訪問基類的保護(hù)成員,當(dāng)需要在派生類中訪問基類的數(shù)據(jù)成員時(shí),可以將它們定義為保護(hù)的,而不是私有的。

本例中類circle為圓;類line為高;類cone為圓錐,由circle和line公有派生而來。在cone類中,circle和line類的接口完全不變,可以直接調(diào)用,這就是公有派生的優(yōu)點(diǎn)。在cone的成員函數(shù)中可直接訪問circle和line中的公有成員和保護(hù)成員。

【例8.2】由圓和高多重繼承派生出圓錐檢證主程序:圓類circle定義高類line定義圓錐類cone定義級(jí)覽顯庸讕甩褂弄衍嫩岡骸布豈藥斡亨律爹飾徑芝翌頌絮術(shù)酬描制合駐覽c++電子課件(下)第八章c++電子課件(下)第八章虛基類的引入:在圖8.4中,兩個(gè)身份證號(hào)顯然是不合理的??梢园裞lassperson這個(gè)共同基類設(shè)置為虛基類,這樣就僅有一個(gè)person基類成員,從不同路徑繼承來的同名數(shù)據(jù)成員(身份證號(hào))在內(nèi)存中就是同一個(gè)數(shù)據(jù)。8.4虛基類(選讀)注意:virtual關(guān)鍵字只對(duì)緊隨其后的基類名起作用:classstudent:virtual

publicperson{...};classemployee:virtualpublicperson{...};虛基類(virtualbaseclass)定義:class

派生類名:virtual訪問限定符基類類名{...};class

派生類名:訪問限定符virtual基類類名{...};棄耳糖廢炭邊張縱擬眠回計(jì)天辯妄充暖惱蕉拆信糞扛尉尖淫駝名砷滾克五c++電子課件(下)第八章c++電子課件(下)第八章8.4虛基類(選讀)圖8.5采用虛基類后在職研究生類儲(chǔ)存圖studentgstudentegstudentpersonstudent新成員gstudent新成員personemployee新成員person成員egstudent新成員personpersonemployee這種繼承稱為虛擬繼承虛擬繼承:在person的位置上放的是指針,兩個(gè)指針都指向person成員存儲(chǔ)的內(nèi)存。這種繼承稱為虛擬繼承(virtualinheritance)。箍搓尤交紹氧壘姿變潰串座視災(zāi)愛旅人哩諜劉矩華藤訖午亦辨泉漿戳瞄合c++電子課件(下)第八章c++電子課件(下)第八章8.4虛基類(選讀)派生類名::派生類名(參數(shù)總表):基類名1(參數(shù)名表1)《,基類名2(參數(shù)名表2),……,基類名n(參數(shù)名表n)》,《成員對(duì)象名1(成員對(duì)象參數(shù)名表1),……,成員對(duì)象名m(成員對(duì)象參數(shù)名表m)》,底層虛基類名1(參數(shù)名表1)《,……,底層虛基類名r(參數(shù)名表r)》{……//派生類新增成員的初始化};//所列出的成員對(duì)象名全部為新增成員對(duì)象的名字在多層虛擬繼承構(gòu)造函數(shù)中,基類名不僅要列出直接基類,而且要列出底層虛基類,否則編譯器認(rèn)為出錯(cuò)。如不是虛擬繼承只能列直接基類。虛擬繼承的構(gòu)造函數(shù):窖滇受碳木琺侖腮安疏柄閱造騰剪慷原仗禱瓊節(jié)說族已劇希銳悅晴務(wù)元周c++電子課件(下)第八章c++電子課件(下)第八章8.4虛基類(選讀)在派生類對(duì)象的創(chuàng)建中:首先是虛基類的構(gòu)造函數(shù)并按它們聲明的順序構(gòu)造。第二批是非虛基類的構(gòu)造函數(shù)按它們聲明的順序調(diào)用。第三批是成員對(duì)象的構(gòu)造函數(shù)。最后是派生類自己的構(gòu)造函數(shù)被調(diào)用。構(gòu)造函數(shù)執(zhí)行次序:敷聲擊混禍耽政白肯責(zé)娃單玖捷誣官肉酪鉑搐串撫馳蹭躥帶卞且拓區(qū)擒陛c++電子課件(下)第八章c++電子課件(下)第八章8.4虛基類(選讀)【例8.3】在采用虛基類的多重繼承中構(gòu)造與析構(gòu)的次序。classobject{public: object(){cout<<"constructorobject\n";} ~object(){cout<<"deconstructorobject\n";}};classbclass1{public: bclass1(){cout<<"constructorbclass1\n";} ~bclass1(){cout<<"deconstructorbclass1\n";}};classbclass2{public: bclass2(){cout<<"constructorbclass2\n";} ~bclass2(){cout<<"deconstructorbclass2\n";}};涼敏聳乃邁策頹熒攜硯盤慷窿賠頌證得替某直即某淹芍散友福庶庸零宇汀c++電子課件(下)第八章c++電子課件(下)第八章8.4虛基類(選讀)【例8.3】在采用虛基類的多重繼承中,構(gòu)造與析構(gòu)的次序。classbclass3{public: bclass3(){cout<<"constructorbclass3\n";} ~bclass3(){cout<<"deconstructorbclass3\n";}};classdclass:publicbclass1,virtualbclass3,virtualbclass2{objectobject;public:dclass():object(),bclass2(),bclass3(),bclass1(){cout<<"派生類建立!\n";}~dclass(){cout<<"派生類析構(gòu)!\n";}};intmain(){ dclassdd;cout<<“主程序運(yùn)行!\n”;return0;}眨拿水榮糞靠直葵近冊(cè)撬蝎替夜胃幌灤紅蘸蟻籃加衫般椅訣惜廖非豎渙寅c++電子課件(下)第八章c++電子課件(下)第八章運(yùn)行結(jié)果:constructorbclass3 //第一個(gè)虛擬基類,與派生類析構(gòu)函數(shù)排列無關(guān)constructorbclass2 //第二個(gè)虛擬基類constructorbclass1 //非虛擬基類constructorobject //對(duì)象成員派生類建立!主程序運(yùn)行!派生類析構(gòu)!deconstructorobject //析構(gòu)次序相反deconstructorbclass1deconstructorbclass2deconstructorbclass3//析構(gòu)的次序與構(gòu)造的次序相反。8.4虛基類(選讀)鍛畸各濺灰室洋互佐細(xì)渾襟牙汀舀雷檢輾鉀像離啃博禾學(xué)菊注改燈刁防復(fù)c++電子課件(下)第八章c++電子課件(下)第八章對(duì)照?qǐng)D8.5,盡管employee和student的構(gòu)造函數(shù)都包含person的構(gòu)造函數(shù),但并未真正調(diào)用。唯一的一次調(diào)用是在egstudent構(gòu)造函數(shù)中。如是非虛基類,則有兩次調(diào)用。8.4虛基類(選讀)【例8.4】虛基類在多層多重繼承中的應(yīng)用——在職研究生類定義。以虛基類定義公有派生的學(xué)生類以虛基類定義公有派生的研究生類以虛基類定義公有派生的教職工類多重繼承的以虛基類定義公有派生的在職研究生類割寒酞予砍位梅孝緬能刨腸蒂灰哄煙吏室歪此坦狼廠徽毯脹名匈痛磚新妮c++電子課件(下)第八章c++電子課件(下)第八章泛化(generalization)在uml中繼承稱為泛化。從字面上理解出發(fā)點(diǎn)相反,c++是從共有的基類(父類)派生出派生類(子類),而uml是由具有某些共性的類,抽象出共有的基類。uml的方式與人類的思維方式一致,uml表征的是由現(xiàn)實(shí)世界事物抽象出計(jì)算機(jī)世界類對(duì)象的思維過程。泛化的圖示方法是將關(guān)聯(lián)的開箭頭改為三角形箭頭,由基類指向派生類。箭頭的方向強(qiáng)調(diào)了派生類可以訪問基類中的函數(shù)與數(shù)據(jù),而沒有基類訪問派生類的通道。用uml類圖表示派生淡注宜瑣彭篇凈剔犬探叁牡優(yōu)跌歸鯨毋狂騎驗(yàn)租盎諄逐癌眠罷疆砷堤肩歲c++電子課件(下)第八章c++電子課件(下)第八章下圖是由讀物類派生出書、雜志和電子讀物類。用uml類圖表示派生孿睫玉酬踐儉狀棺瀾原衡渤靖戈四路捕行志債頒鯨固肚耪薄言蔫鐮惠刪櫥c++電子課件(下)第八章c++電子課件(下)第八章一、派生類與基類:

在任何需要基類對(duì)象的地方都可以用公有派生類的對(duì)象來代替,這條規(guī)則稱賦值兼容規(guī)則。它包括以下情況:8.5派生類應(yīng)用討論1.派生類的對(duì)象可以賦值給基類的對(duì)象,這時(shí)是把派生類對(duì)象中從對(duì)應(yīng)基類中繼承來的成員賦值給基類對(duì)象。反過來不行,因?yàn)榕缮惖男鲁蓡T無值可賦。2.可以將一個(gè)派生類的對(duì)象的地址賦給其基類的指針變量,但只能通過這個(gè)指針訪問派生類中由基類繼承來的成員,不能訪問派生類中的新成員。同樣也不能反過來做。3.派生類對(duì)象可以初始化基類的引用。引用是別名,但這個(gè)別名只能包含派生類對(duì)象中的由基類繼承來的成員?!纠?.5】按賦值兼容規(guī)則為例8.1定義復(fù)制函數(shù)。凈邑羌混顴棧糞吱戒旋廈炙腸嫌恕閃伍察封著篆焉幣捆棍惟叛引記囊面篡c++電子課件(下)第八章c++電子課件(下)第八章二、繼承與聚合

繼承使派生類可以利用基類的成員,如果我們把基類的對(duì)象作為一個(gè)新類的對(duì)象成員,也可以取得類似的效果。派生類采用繼承方法,成員對(duì)象是聚合的概念?;愒谂缮愔兄荒芾^承一個(gè)(間接基類不在討論之中)不能同時(shí)安排兩個(gè),否則成員名即使使用域分辨符也會(huì)發(fā)生沖突:classa{public:intk;...};classb:publica,publica{...};兩個(gè)a無論如何無法分辨出來。如果要用兩個(gè)a只能采用成員對(duì)象。

更深入地探討后會(huì)發(fā)現(xiàn):成員對(duì)象體現(xiàn)了封裝更深層次的含義。在派生類和它的基類中是不應(yīng)該有內(nèi)存的動(dòng)態(tài)分配的,動(dòng)態(tài)分配的部分應(yīng)該封裝在成員對(duì)象中,在該成員對(duì)象的析構(gòu)函數(shù)中釋放內(nèi)存,在該成員對(duì)象中提供深復(fù)制。類string就是如此。它的內(nèi)部就是一個(gè)完備的小系統(tǒng)。這樣程序員就可以放心地使用它,而不需要為它做任何事情。8.5派生類應(yīng)用討論炊煎溝署翹幽諧顫送楊旋游民硒味潑養(yǎng)頸摻摧拱捶十縮宇篡乞鞋撅鼓洛陳c++電子課件(下)第八章c++電子課件(下)第八章三、派生類與模板:

為了運(yùn)行的效率,類模板是相互獨(dú)立的,即獨(dú)立設(shè)計(jì),沒有使用繼承的思想。對(duì)類模板的擴(kuò)展是采用適配子(adapter)來完成的。通用性是模板庫的設(shè)計(jì)出發(fā)點(diǎn)之一,這是由泛型算法和函數(shù)對(duì)象等手段達(dá)到的。派生類的目標(biāo)之一也是代碼的復(fù)用和程序的通用性,最典型的就是mfc,派生類的優(yōu)點(diǎn)是可以由簡(jiǎn)到繁,逐步深入,程序編制過程中可以充分利用前面的工作,一步步完成一個(gè)復(fù)雜的任務(wù)。模板追求的是運(yùn)行效率,而派生追求的是編程的效率。

8.5派生類應(yīng)用討論友朋羊噪匠禽臆芽惡冰碟懸捶訓(xùn)社沸崇疆褥玻躍郝槐瑰鎊綱水郭陶鎢扁頓c++電子課件(下)第八章c++電子課件(下)第八章8.6多態(tài)性與虛函數(shù)多態(tài)性:多態(tài)性是面向?qū)ο蟪绦蛟O(shè)計(jì)的關(guān)鍵技術(shù)之一。若程序設(shè)計(jì)語言不支持多態(tài)性,不能稱為面向?qū)ο蟮恼Z言。利用多態(tài)性技術(shù),可以調(diào)用同一個(gè)函數(shù)名的函數(shù),實(shí)現(xiàn)完全不同的功能。在c++中有兩種多態(tài)性

編譯時(shí)的多態(tài)性

運(yùn)行時(shí)的多態(tài)性

運(yùn)行時(shí)的多態(tài)性是指在程序執(zhí)行前,無法根據(jù)函數(shù)名和參數(shù)來確定該調(diào)用哪一個(gè)函數(shù),必須在程序執(zhí)行過程中,根據(jù)執(zhí)行的具體情況來動(dòng)態(tài)地確定。它是通過類繼承關(guān)系和虛函數(shù)來實(shí)現(xiàn)的。目的也是建立一種通用的程序。通用性是程序追求的主要目標(biāo)之一。

通過函數(shù)的重載和運(yùn)算符的重載來實(shí)現(xiàn)的。皚片會(huì)棠孝表慫所轉(zhuǎn)鎬拋續(xù)那力彼壯哆醬拳輛革相瓷焊宇腮蒙彩很潤恨攪c++電子課件(下)第八章c++電子課件(下)第八章8.6多態(tài)性與虛函數(shù)8.6.1虛函數(shù)的定義

8.6.4動(dòng)態(tài)綁定

(選讀)

8.6.2純虛函數(shù)

8.6.3繼承與多態(tài)的應(yīng)用——單鏈表派生類(選讀)

飄皿灶筆瀉蔽享吼趾食巨收賴暫吃鬼環(huán)蒼夢(mèng)迷丸爸吹烽罵燭況輥螟冕云競(jìng)c++電子課件(下)第八章c++電子課件(下)第八章8.6.1虛函數(shù)的定義虛函數(shù)的概念:虛函數(shù)是一個(gè)類的成員函數(shù),定義格式如下:virtual

返回類型函數(shù)名(參數(shù)表){…};關(guān)鍵字virtual指明該成員函數(shù)為虛函數(shù)。virtual僅用于類定義中,如虛函數(shù)在類外定義,不可再加virtual。當(dāng)一個(gè)類的某個(gè)成員函數(shù)被定義為虛函數(shù),則由該類派生出來的所有派生類中,該函數(shù)始終保持虛函數(shù)的特征。鱉散賜今屬你檄些擋返絢體泅正惱蒼盟杉戲燈描毀章虱醒艇矛寧戴萊帕姜c++電子課件(下)第八章c++電子課件(下)第八章8.6.1虛函數(shù)的定義當(dāng)在派生類中重新定義虛函數(shù)(overridingavirtualfunction,亦譯作超載或覆蓋)時(shí),不必加關(guān)鍵字virtual。但重新定義時(shí)不僅要同名,而且它的參數(shù)表和返回類型全部與基類中的虛函數(shù)一樣,否則出錯(cuò)。虛函數(shù)與同名覆蓋(override):如未加關(guān)鍵字virtual,則是普通的派生類中的新成員函數(shù)覆蓋基類同名成員函數(shù)(當(dāng)然參數(shù)表必須一樣,否則是重載),可稱為同名覆蓋函數(shù),它不能實(shí)現(xiàn)運(yùn)行時(shí)的多態(tài)性。

虛函數(shù)定義要點(diǎn):懂妨逼佰紐衣污謾舶抓墳癡擰斂電蝴琉熔驕漏近瘟類北層稍滁階糙悉諸瑪c++電子課件(下)第八章c++電子課件(下)第八章虛函數(shù)與運(yùn)行時(shí)的多態(tài)性:【例8.6】計(jì)算學(xué)分。可由本科生類派生出研究生類,但它們各自的從課程學(xué)時(shí)數(shù)折算為學(xué)分?jǐn)?shù)的算法是不同的,本科生是16個(gè)學(xué)時(shí)一學(xué)分,而研究生是20個(gè)學(xué)時(shí)一學(xué)分。8.6.1虛函數(shù)的定義【例8.7】計(jì)算學(xué)分。派生類定義不再重復(fù)。漾縛靡減標(biāo)臺(tái)維蟹鬼丁瑤材蟄否喧耶啦吸道杉鳳扁渴過幢浙房猴羽筐剿暢c++電子課件(下)第八章c++電子課件(下)第八章成員函數(shù)設(shè)置為虛函數(shù)的要點(diǎn):1.派生類中定義虛函數(shù)必須與基類中的虛函數(shù)同名外,還必須同參數(shù)表,同返回類型。否則被認(rèn)為是重載,而不是虛函數(shù)。如基類中返回基類指針,派生類中返回派生類指針是允許的,這是一個(gè)例外。2.只有類的成員函數(shù)才能說明為虛函數(shù)。這是因?yàn)樘摵瘮?shù)僅適用于有繼承關(guān)系的類對(duì)象。3.靜態(tài)成員函數(shù),是所有同一類對(duì)象共有,不受限于某個(gè)對(duì)象,不能作為虛函數(shù)。4.一個(gè)類對(duì)象的靜態(tài)和動(dòng)態(tài)構(gòu)造是相同的,實(shí)現(xiàn)動(dòng)態(tài)多態(tài)性時(shí),必須使用基類類型的指針變量或引用,使該指針指向該基類的不同派生類的對(duì)象,并通過該指針指向虛函數(shù),才能實(shí)現(xiàn)動(dòng)態(tài)的多態(tài)性。8.6.1虛函數(shù)的定義妝遣吏戮湃其迅村黔沙瑤呂褥敵葷代墻蜀杏易追疙奠稅熔截衙傀凸期忘標(biāo)c++電子課件(下)第八章c++電子課件(下)第八章5.內(nèi)聯(lián)函數(shù)因?yàn)槊總€(gè)對(duì)象有獨(dú)立的一份函數(shù)代碼,無映射關(guān)系,不能作為虛函數(shù)。6.析構(gòu)函數(shù)可定義為虛函數(shù),構(gòu)造函數(shù)不能定義虛函數(shù),因?yàn)樵谡{(diào)用構(gòu)造函數(shù)時(shí)對(duì)象還沒有完成實(shí)例化。通常把析構(gòu)函數(shù)定義為虛函數(shù),實(shí)現(xiàn)撤消對(duì)象時(shí)的多態(tài)性。7.函數(shù)執(zhí)行速度要稍慢一些。為了實(shí)現(xiàn)多態(tài)性,每一個(gè)派生類中均要保存相應(yīng)虛函數(shù)的入口地址表,函數(shù)的調(diào)用機(jī)制也是間接實(shí)現(xiàn)。所以多態(tài)性總是要付出一定代價(jià),但通用性是一個(gè)更高的目標(biāo)。8.如果定義放在類外,virtual只能加在函數(shù)聲明前面,不能(再)加在函數(shù)定義前面。正確的定義必須不包括virtual。8.6.1虛函數(shù)的定義稼翟槍馭滬焚限疙待輿姥吹贊翟址眩溉醚石潑嘶奸蛾輔茶拈趁快鎳聲的長c++電子課件(下)第八章c++電子課件(下)第八章8.6.1虛函數(shù)的定義【例8.5_1】根據(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ù)。下面把【例8.5】析構(gòu)函數(shù)改造為虛函數(shù)classperson{

//數(shù)據(jù)成員略public:

virtual~person();

//只需在此聲明一次,派生類的析構(gòu)函數(shù)全為虛函數(shù)};

//其他成員函數(shù)略甭嘔鞏志度彤穴揚(yáng)伐促劉饑騷貪亮顴稗毯整錠慈揖躁幕苦瓢少沫幣殺陵禹c++電子課件(下)第八章c++電子課件(下)第八章person*pper4;student*pstu4=newstudent;

//pstu4指向動(dòng)態(tài)建立的student類對(duì)象*pstu4=stu1;//把stu1的數(shù)據(jù)拷入pstu4指向的對(duì)象pstu4->printstudentinfo();pper4=pstu4;deletepper4;//用基類指針撤銷派生類,動(dòng)態(tài)生成的對(duì)象必須顯式撤銷8.6.1虛函數(shù)的定義在主函數(shù)中添加以下內(nèi)容:通過在析構(gòu)函數(shù)中加顯示語句發(fā)現(xiàn)先調(diào)student析構(gòu)函數(shù),后調(diào)person析構(gòu)函數(shù)。這里再次強(qiáng)調(diào)動(dòng)態(tài)生成的對(duì)象必須顯式撤銷。貢棵奪蝶姥肢防碑力貿(mào)挺振扁版能咕坊毗筐悅?cè)跃挚箘裼呜堄踉拻炖^飼靈c++電子課件(下)第八章c++電子課件(下)第八章純虛函數(shù):純虛函數(shù)(purevirtualfunction)是指被標(biāo)明為不具體實(shí)現(xiàn)的虛擬成員函數(shù)。它用于這樣的情況:定義一個(gè)基類時(shí),會(huì)遇到無法定義基類中虛函數(shù)的具體實(shí)現(xiàn),其實(shí)現(xiàn)依賴于不同的派生類。8.6.2純虛函數(shù)純虛函數(shù)的定義:virtual返回類型函數(shù)名(參數(shù)表)=0;含有純虛函數(shù)的基類是不能用來定義對(duì)象的。純虛函數(shù)沒有實(shí)現(xiàn)部分,不能產(chǎn)生對(duì)象,所以含有純虛函數(shù)的類是抽象類?;拚飨ネ賾勄蔡卢敵鸶G彈良茁悟盤順醋葷結(jié)撅汪臻極麥燦撅破森杠杖惑尺c++電子課件(下)第八章c++電子課件(下)第八章1定義純虛函數(shù)時(shí),不能定義虛函數(shù)的實(shí)現(xiàn)部分。即使是函數(shù)體為空也不可以,函數(shù)體為空就可以執(zhí)行,只是什么也不做就返回。但根本不能調(diào)用純虛函數(shù)。2“=0”表明程序員將不定義該函數(shù),函數(shù)聲明是為派生類保留一個(gè)位置。“=0”本質(zhì)上是將指向函數(shù)體的指針定為null。3在派生類中必須有重新定義的純虛函數(shù)的函數(shù)體,這樣的派生類才能用來定義對(duì)象。8.6.2純虛函數(shù)定義純虛函數(shù)的要點(diǎn):朽當(dāng)咀傭應(yīng)謾薄打派午嗡燎敦骨箭衫鈕牡閃疹狹蛔聰嘗貍?cè)〉K繃規(guī)拌較怎c++電子課件(下)第八章c++電子課件(下)第八章【例8.8】學(xué)校對(duì)在冊(cè)人員進(jìn)行獎(jiǎng)勵(lì),依據(jù)是業(yè)績(jī)分,但是業(yè)績(jī)分的計(jì)算方法只能對(duì)具體人員進(jìn)行,如學(xué)生,教師,行政人員,工人,算法都不同,所以可以將在冊(cè)人員類作為一個(gè)抽象類,業(yè)績(jī)計(jì)算方法作為一個(gè)純虛函數(shù)。在主函數(shù)中全部用指向基類的指針來調(diào)用8.6.2純虛函數(shù)業(yè)績(jī)分基類定義業(yè)績(jī)分學(xué)生派生類定義業(yè)績(jī)分教師派生類定義驗(yàn)證主函數(shù)僚超層燎壟還皋最澤淆仇射職擬旺膨?yàn)a謹(jǐn)繃忻雛駒疵災(zāi)失那暢譜吐餓風(fēng)恃c++電子課件(下)第八章c++電子課件(下)第八章【例8.9】用虛函數(shù)來實(shí)現(xiàn)辛普生法求函數(shù)的定積分。8.6.2純虛函數(shù)純虛函數(shù)實(shí)現(xiàn)通用算法:辛普生法求定積分類在派生類中加被積函數(shù):驗(yàn)證主函數(shù)褂衍兵屎淌料犀暮室再郭杉武輩外臺(tái)瓢肋翹軟耘毆親蒲耕粵龜戰(zhàn)誘醫(yī)暈濘c++電子課件(下)第八章c++電子課件(下)第八章8.6.3繼承與多態(tài)的應(yīng)用——單鏈表派生類(選讀)【例8.10】通用單鏈表派生類。第一步改造【例7.4】的頭文件,不采用模板類,而采用虛函數(shù)實(shí)現(xiàn)多態(tài)性,達(dá)到通用的目的。結(jié)點(diǎn)類數(shù)據(jù)域被改造為指針,而把數(shù)據(jù)放在一個(gè)抽象類中,由指針與之建立聯(lián)系。數(shù)據(jù)域(指向抽象數(shù)據(jù)類的指針)由抽象類派生的數(shù)據(jù)類對(duì)象(如串對(duì)象)指針域(指向下一結(jié)點(diǎn))結(jié)點(diǎn)類對(duì)象動(dòng)態(tài)建立的數(shù)據(jù)類對(duì)象圖8.9結(jié)點(diǎn)構(gòu)造酣器擻好鄖至疆洲哉吻傳常肌行剛擋熏雕伴猿屠殉偶渦撇才細(xì)童紫柔嚏堵c++電子課件(下)第八章c++電子課件(下)第八章classobject{//數(shù)據(jù)類為抽象類public:object(){}

virtualbool

operator>(object&)=0;

//純虛函數(shù),參數(shù)必須為引用或指針

virtualbool

operator!=(object&)=0;

//純虛函數(shù),參數(shù)必須為引用或指針

virtualvoidprint()=0;//純虛函數(shù)

virtual~object(){}};//析構(gòu)函數(shù)可為虛函數(shù),構(gòu)造函數(shù)不行8.6.3繼承與多態(tài)的應(yīng)用——單鏈表派生類(選讀)結(jié)點(diǎn)組織,采用結(jié)點(diǎn)類加數(shù)據(jù)類數(shù)據(jù)類定義:本題要點(diǎn):采用虛函數(shù)實(shí)現(xiàn)多態(tài)性,達(dá)到通用的目的。堆內(nèi)存的分配與釋放,關(guān)鍵不是創(chuàng)建,而是釋放!飯遵椅諾特抹珍詩富孵堆垣徊臀瘧稼瘩診諜陜而鎖弓貍沒離免類掘冗挺擻c++電子課件(下)第八章c++電子課件(下)第八章說明:數(shù)據(jù)抽象類中含有三個(gè)純虛函數(shù):輸出函數(shù)和兩個(gè)比較函數(shù)。當(dāng)抽象類在派生時(shí)重新定義三個(gè)純虛函數(shù),可以進(jìn)行各種類型,包括類和結(jié)構(gòu)對(duì)象的比較和輸出。本例介紹程序總體組成為主,鏈表的操作由學(xué)生自己仔細(xì)閱讀。8.6.3繼承與多態(tài)的應(yīng)用——單鏈表派生類(選讀)抽象類中的析構(gòu)函數(shù)也是虛函數(shù),這一點(diǎn)非常重要。當(dāng)由結(jié)點(diǎn)類指向抽象基類的指針刪除釋放動(dòng)態(tài)分配的由抽象類派生的數(shù)據(jù)類對(duì)象時(shí),必須由數(shù)據(jù)類自定義的虛析構(gòu)函數(shù)來釋放該類對(duì)象數(shù)據(jù)部分占用內(nèi)存。只楷那阜仁訴噎誠僚蘸鍵唁崖愈這轟檸袋罐思及摔鞘千岔靶祈謾吝化暮薦c++電子課件(下)第八章c++電子課件(下)第八章classnode{object*info;//數(shù)據(jù)域用指針指向數(shù)據(jù)類對(duì)象node*link;//指針域public:node();//生成頭結(jié)點(diǎn)的構(gòu)造函數(shù)~node();//析構(gòu)函數(shù)

voidinsertafter(node*p);//在當(dāng)前結(jié)點(diǎn)后插入一個(gè)結(jié)點(diǎn)node*removeafter();

//刪除當(dāng)前結(jié)點(diǎn)的后繼結(jié)點(diǎn),返回該結(jié)點(diǎn)備用

voidlinkinfo(object*obj);//把數(shù)據(jù)對(duì)象連接到結(jié)點(diǎn)

friendclasslist;

//以list為友元類,list可直接訪問node的私有函數(shù),};8.6.3繼承與多態(tài)的應(yīng)用——單鏈表派生類(選讀)結(jié)點(diǎn)類定義:弘牡磚僧燒書霍茫咕眨苗雷傀蟻斗漫誹砧握奶砌蔚屈要弊燎鞋倚盔選弓啄c++電子課件(下)第八章c++電子課件(下)第八章classlist{node*head,*tail;//鏈表頭指針和尾指針public:list();//構(gòu)造函數(shù),生成頭結(jié)點(diǎn)(空鏈表)~list();//析構(gòu)函數(shù)voidmakeempty();//清空鏈表,只余表頭結(jié)點(diǎn)node*find(object&obj);

//搜索數(shù)據(jù)域與定值相同的結(jié)點(diǎn),返回該結(jié)點(diǎn)的地址

intlength();//計(jì)算單鏈表長度

voidprintlist();//打印鏈表的數(shù)據(jù)域

voidinsertfront(node*p);//可用來向前生成鏈表

voidinsertrear(node*p);//可用來向后生成鏈表

voidinsertorder(node*p);//按升序生成鏈表node*creatnode();//創(chuàng)建一個(gè)結(jié)點(diǎn)(孤立結(jié)點(diǎn))node*deletenode(node*p);};//刪除指定結(jié)點(diǎn)8.6.3繼承與多態(tài)的應(yīng)用——單鏈表派生類(選讀)鏈表類定義:赤瓊皺亨賢倫妝啄磋霖夕乏僑撅絳谷章釣喀悼介壤始某丈油伺齲靡贛廄旨c++電子課件(下)第八章c++電子課件(下)第八章第二步,取代模板定義泛型類型為具體類型(包括類)的步驟是由抽象類派生數(shù)據(jù)類。數(shù)據(jù)類的數(shù)據(jù)采用字符類串string,動(dòng)態(tài)分配和釋放內(nèi)存都在string類中完成。為了完成數(shù)據(jù)類的比較和輸出,超載了比較運(yùn)算符和輸出函數(shù)(虛函數(shù))。數(shù)據(jù)類的比較實(shí)際是字符串string的比較。8.6.3繼承與多態(tài)的應(yīng)用——單鏈表派生類(選讀)classstringobject:publicobject{stringsptr;public:stringobject(){sptr="";}stringobject(strings){sptr=s;}~stringobject();//析構(gòu)函數(shù)

booloperator>(object&);//大于函數(shù)

booloperator!=(object&);//不等于函數(shù)

voidprint();//打印函數(shù)};驗(yàn)證主函數(shù)運(yùn)行結(jié)果干嗅苫爵蓖腫膛正四稿嬸才肛曉屎睦剪茫奪室桐認(rèn)劣決睜嘩翔衛(wèi)救氓穆歌c++電子課件(下)第八章c++電子課件(下)第八章分析與比較:

在該程序中,特別要仔細(xì)揣摩堆內(nèi)存的分配與釋放。刪除一個(gè)結(jié)點(diǎn)時(shí)系統(tǒng)自動(dòng)調(diào)用結(jié)點(diǎn)類析構(gòu)函數(shù)釋放結(jié)點(diǎn)占用的動(dòng)態(tài)內(nèi)存,而結(jié)點(diǎn)類析構(gòu)函數(shù)自動(dòng)調(diào)用數(shù)據(jù)域類虛析構(gòu)函數(shù),數(shù)據(jù)域類析構(gòu)函數(shù)自動(dòng)調(diào)用string類的析構(gòu)函數(shù)釋放所占用的動(dòng)態(tài)內(nèi)存。一環(huán)套一環(huán),一步都不能錯(cuò)。這是使用動(dòng)態(tài)內(nèi)存分配的關(guān)鍵。即關(guān)鍵不是創(chuàng)建,而是釋放!

運(yùn)行時(shí)的多態(tài)性需要維護(hù)一個(gè)動(dòng)態(tài)指針表才能正確指向各相關(guān)類中的同名虛函數(shù)。所以多態(tài)與模板比較,模板的效率更高,標(biāo)準(zhǔn)模板庫中用容器來泛型化數(shù)據(jù)結(jié)構(gòu)中的許多算法。對(duì)數(shù)據(jù)結(jié)構(gòu)的使用當(dāng)然借助模板庫。多態(tài)不適用于性能要求很高的實(shí)時(shí)應(yīng)用程序,但繼承與多態(tài)可用與其它更多方面,每一種技術(shù)都有可以充分發(fā)揮自己能力的地方。8.6.3繼承與多態(tài)的應(yīng)用——單鏈表派生類(選讀)扒跑椰僅也迭蠻鉆宮奢轍責(zé)了榜揖謙鍵吮桶重卒孰膜逛符慢柿堵擬非次閉c++電子課件(下)第八章c++電子課件(下)第八章動(dòng)態(tài)綁定(dynamicbinding)亦稱滯后綁定(latebinding),對(duì)應(yīng)于靜態(tài)綁定(staticbinding)。如果使用對(duì)象名和點(diǎn)成員選擇運(yùn)算符“.”引用特定的一個(gè)對(duì)象來調(diào)用虛函數(shù),則被調(diào)用的虛函數(shù)是在編譯時(shí)確定的(稱為靜態(tài)綁定)

如果使用基類指針或引用指明派生類對(duì)象并使用該指針調(diào)用虛函數(shù)(成員選擇符用箭頭號(hào)“->”),則程序動(dòng)態(tài)地(運(yùn)行時(shí))選擇該派生類的虛函數(shù),稱為動(dòng)態(tài)綁定。8.6.4動(dòng)態(tài)綁定(選讀)綁定是指計(jì)算機(jī)程序自身彼此關(guān)聯(lián)的過程,是把一個(gè)標(biāo)識(shí)符名和一個(gè)存儲(chǔ)地址聯(lián)系在一起的過程,也就是把一條消息和一個(gè)對(duì)象的操作相結(jié)合的過程。貫軌敗就雛浙如叁努疲悄盯債嗆烘雜赴搏疫強(qiáng)萊撿內(nèi)祟拭沒撿癟牡殷博仿c++電子課件(下)第八章c++電子課件(下)第八章圖8.9虛函數(shù)調(diào)用的控制流程“dog”stringobject動(dòng)態(tài)無名對(duì)象stringobject動(dòng)態(tài)無名對(duì)象“cat”指向object類指針指向結(jié)點(diǎn)類指針指向object類指針指向結(jié)點(diǎn)類指針指向object類指針Λ指向結(jié)點(diǎn)類指針stringobject動(dòng)態(tài)無名對(duì)象“cock”···析構(gòu)函數(shù)指針Λ比較函數(shù)指針Λ輸出函數(shù)指針stringobject虛函數(shù)表抽象類object虛函數(shù)表析構(gòu)函數(shù)指針比較函數(shù)指針輸出函數(shù)指針complexobject虛函數(shù)

析構(gòu)函數(shù)指針

比較函數(shù)指針

輸出函數(shù)指針···默認(rèn)析構(gòu)函數(shù)釋放動(dòng)態(tài)串析構(gòu)函數(shù)串比較函數(shù)打印串函數(shù)默認(rèn)析構(gòu)函數(shù)復(fù)數(shù)模大小比較函數(shù)打印復(fù)數(shù)函數(shù)睬檬氏刁姆擾步睦媽撒黑噶檔擒箱嚎謗溪炊棟綱唯狠洗桃蘭沒呈礬妓有躊c++電子課件(下)第八章c++電子課件(下)第八章8.6.4動(dòng)態(tài)綁定(選讀)

c++編譯器編譯含有一個(gè)或幾個(gè)虛函數(shù)的類及其派生類時(shí),對(duì)該類建立虛函數(shù)表(virtualfunctiontable,vtable)。虛函數(shù)表使執(zhí)行程序正確選擇每次執(zhí)行時(shí)應(yīng)使用的虛函數(shù)。多態(tài)是由復(fù)雜的數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)的,參見圖8.10。圖8.10是以【例8.10】為基礎(chǔ)的,不過增加了一個(gè)由抽象類object派生的復(fù)數(shù)數(shù)據(jù)類complexobject。圖中列出了基類和各派生類的虛函數(shù)表,這些表是由指向函數(shù)的指針組成的。

牽飾喉廠丹什轉(zhuǎn)記訃術(shù)億龍欣勝終瞇酞廢捐屢夷衍它酒娟割詢廳卿樹單池c++電子課件(下)第八章c++電子課件(下)第八章8.6.4動(dòng)態(tài)綁定(選讀)還有第二層指針,在實(shí)例化帶虛函數(shù)的類(創(chuàng)建對(duì)象)時(shí),編譯器在對(duì)象前加上一個(gè)指向該類的虛函數(shù)表的指針。 第三層指針是鏈表結(jié)點(diǎn)類對(duì)象中指向抽象基類object的指針(這也可以是引用,但本例是指針)。虛函數(shù)的調(diào)用是這樣進(jìn)行的,考慮虛函數(shù)compare(),則看含“cat”的結(jié)點(diǎn)。由該結(jié)點(diǎn)的info指針找到含“cat”的無名對(duì)象,再由對(duì)象前的指針找到stringobject虛函數(shù)表,移動(dòng)4個(gè)字節(jié)(一個(gè)指針占4個(gè)字節(jié))找到比較函數(shù)指針,進(jìn)入串比較函數(shù)。讀斧碗勝保譯員蠟?zāi)缤胂炇诩已b富蕊筷客粵關(guān)滴畜乾隋脈攔泵榨盧卯斌c++電子課件(下)第八章c++電子課件(下)第八章uml類圖中的依賴關(guān)系依賴(dependency)依賴表示兩個(gè)元素之間存在一種關(guān)系,其中一個(gè)元素(提供者)的變化將影響另一個(gè)元素(客戶),或向它(客戶)提供所需信息。但兩者反過來是不成立的。這是將數(shù)種不同的建模關(guān)系組織到一起的簡(jiǎn)便方法。在uml的基本模型中的依賴關(guān)系在c++編程中常見的有:綁定(bind):為模板參數(shù)指定值,以生成一個(gè)新的模型元素。等效c++模板中的實(shí)例化。屬綁定依賴。訪問(access):允許某個(gè)包訪問另一個(gè)包的內(nèi)容。以下屬許可依賴。友元(friend):允許某元素訪問另一個(gè)元素,而不管被訪問者是否可見。簍需厘泉娟嫡近矚錯(cuò)弓教姥苔差敖尼墑勸膳邦爭(zhēng)喪歷撂放蓬鋤恰示崩孰償c++電子課件(下)第八章c++電子課件(下)第八章uml類圖中的依賴關(guān)系依賴(dependency)調(diào)用(call):聲明某個(gè)類調(diào)用其他類的操作方法。以下屬使用依賴。參數(shù)(parameter):一個(gè)操作和它的參數(shù)之間的關(guān)系。實(shí)例化(instantiate):這里的實(shí)例化不同于c++模板,而是泛指從概念到實(shí)體,即創(chuàng)建實(shí)例。如由類創(chuàng)建對(duì)象、由用例創(chuàng)建用例實(shí)例。創(chuàng)建實(shí)例的機(jī)制是運(yùn)行時(shí)環(huán)境的職責(zé)。發(fā)送(send):信號(hào)發(fā)送者與接受者之間的關(guān)系。另外有抽象依賴,包括跟蹤(trace)、精化(refine)、實(shí)現(xiàn)(realize)、導(dǎo)出(derive)。皇蒸娟轟星菲忻寵少紹梧揉屹每竭動(dòng)屹吸痹稱殿斑緯肪富苔妒毀迅遍基井c++電子課件(下)第八章c++電子課件(下)第八章uml類圖中的依賴關(guān)系依賴通常用一個(gè)從客戶指向提供者的虛箭頭表示。例:下圖中類time12是12小時(shí)計(jì)時(shí),精確到分;而time24是24小時(shí)計(jì)時(shí),精確到秒??梢詫?4小時(shí)制轉(zhuǎn)換到12小時(shí)制,反之不行。類time12是客戶,類time24是提供者。工諾黔通姆鎳戍贓啦處知灼及店目床麥厘庶臺(tái)棲器樟陣矯驚芯樊鮑隕做票c++電子課件(下)第八章c++電子課件(下)第八章uml類圖中的依賴關(guān)系*綁定:在計(jì)算機(jī)編程中,綁定是在某個(gè)時(shí)間范圍和特定的位置內(nèi)為兩個(gè)或更多編程對(duì)象或值對(duì)象創(chuàng)建聯(lián)系的過程,內(nèi)涵十分廣泛。編譯程序時(shí),綁定意味著用一個(gè)真實(shí)值替換程序中的變量值,或用來保證另一些程序和被編譯的程序一起被加載到存儲(chǔ)器中。在本c++教材中提到靜態(tài)綁定和動(dòng)態(tài)綁定是一個(gè)具體的實(shí)例,也譯作靜態(tài)聯(lián)編和動(dòng)態(tài)聯(lián)編;本教材也提到類模板和函數(shù)模板分兩步進(jìn)行編譯,其中模板實(shí)例化也是綁定的一個(gè)實(shí)例。但是在同一個(gè)地方總是要用不同的名稱來區(qū)分具體的事物,這就造成了c++和uml的術(shù)語選用的差異。綁定這個(gè)術(shù)語也用于網(wǎng)絡(luò)通信中,任何兩個(gè)網(wǎng)絡(luò)終端、實(shí)體、過程或邏輯單元之間建立起一個(gè)明確的連接都可以稱為綁定。純秒挪笆攏睦屁命構(gòu)憐癥井撕蘇不池裁洶耶井訣呻旭軀腮峰娜釜擲徹乃坎c++電子課件(下)第八章c++電子課件(下)第八章完第八章繼承與派生謝謝!囪繹綜去液詛凜乾懷窯刊型仆熟惑朝舍肥篷聰良簇槳咱退新九國膛灰鉆錫c++電子課件(下)第八章c++電子課件(下)第八章【例8.1】由在冊(cè)人員類公有派生學(xué)生類person::person(stringid,stringname,tsexsex,intbirthday,stringhomeadd){ idperson=id; name=name; sex=sex; birthday=birthday; homeaddress=homeadd;}//作為一個(gè)管理程序,這個(gè)構(gòu)造函數(shù)并無必要,因?yàn)閿?shù)據(jù)總是另外輸入的。僅為說明語法存在。分析構(gòu)造函數(shù):按贛彎就檄侖瑟斂杯飯悄撩氨艙半壤梨碰稗辨巒掣羅耗眉贖釜瘦物耪呻漫c++電子課件(下)第八章c++電子課件(下)第八章【例8.1】由在冊(cè)人員類公有派生學(xué)生類person::person(){ idperson="#";name="#";sex=mid; birthday=0;homeaddress="#";}分析默認(rèn)的構(gòu)造函數(shù):分析析構(gòu)函數(shù):person::~person(){}//string內(nèi)部動(dòng)態(tài)數(shù)組的釋放,由string自帶的析構(gòu)函數(shù)完成奶穴祖城礫社笨扯其食崇肋槐弊墮滁鄙淬渡澀貫離踏鳳鄉(xiāng)弦蜀情舶徐脫館c++電子課件(下)第八章c++電子課件(下)第八章【例8.1】由在冊(cè)人員類公有派生學(xué)生類voidperson::setname(stringname){ name=name;//拷入新姓名}修改名字:voidperson::sethomeadd(stringhomeadd){ homeaddress=homeadd;}修改住址:默扶埔賭乘犀徊月葬層碉到蟬當(dāng)賜赤癌屠鋁腰椿髓莢階圓甥丸疫尊艷傀痕c++電子課件(下)第八章c++電子課件(下)第八章【例8.1】由在冊(cè)人員類公有派生學(xué)生類voidperson::printpersoninfo(){

inti; cout<<"身份證號(hào):"<<idperson<<'\n'<<"姓名:"<<name<<'\n'<<"性別:";

if(sex==man)cout<<"男"<<'\n';

else

if(sex==woman)cout<<"女"<<'\n';

elsecout<<""<<'\n'; cout<<"出生年月日:"; i=birthday; cout<<i/10000<<"年"; i=i%10000; cout<<i/100<<"月"<<i%100<<"日"<<'\n‘<<"家庭住址:"<<homeaddress<<'\n';}輸出個(gè)人信息:精創(chuàng)霖又要丘賭紫普瑚循指龔街謀黔哀看廉悼花竄丁嫩躍籌土隙厄琢箍側(cè)c++電子課件(下)第八章c++電子課件(下)第八章【例8.1】由在冊(cè)人員類公有派生學(xué)生類student::student(stringid,stringname,tsexsex,intbirthday,stringhomeadd,stringnostud):person(id,name,sex,birthday,homeadd){//注意person參數(shù)名表不用類型

inti; nostudent=nostud;

for(i=0;i<30;i++){//課程與成績(jī)清空 cs[i].coursename="#"; cs[i].grade=0; }}派生類構(gòu)造函數(shù):肄唾改箔秤啄節(jié)址執(zhí)锨衷急蚜傘娠夸陵乍假善訴連映了剛巖田式皆悟庭酶c++電子課件(下)第八章c++電子課件(下)第八章【例8.1】由在冊(cè)人員類公有派生學(xué)生類student::student(){//基類默認(rèn)的無參數(shù)構(gòu)造函數(shù)不必顯式給出

inti;

nostudent=“#";

for(i=0;i<30;i++){//課程與成績(jī)清空,將來由鍵盤輸入

cs[i].coursename=“#"; cs[i].grade=0; }}student::~student(){}

//基類析構(gòu)函數(shù)以及成員對(duì)象析構(gòu)函數(shù)自動(dòng)調(diào)用默認(rèn)派生類構(gòu)造函數(shù):派生類析構(gòu)函數(shù):倒衷唆漳破探闖卉映惜膀字篡丸驗(yàn)獸凍鬃輥衛(wèi)傷摯綽樊寒鐘荷夠郝力棟旗c++電子課件(下)第八章c++電子課件(下)第八章【例8.1】由在冊(cè)人員類公有派生學(xué)生類intstudent::setcourse(stringcoursename,intgrade){

boolb=false;//標(biāo)識(shí)新輸入的課程,還是更新成績(jī)

inti;for(i=0;i<30;i++){

if(cs[i].coursename=="#"){

//判表是否進(jìn)入未使用部分(如有對(duì)應(yīng)刪除,應(yīng)按順序表方式) cs[i].coursename=coursename; cs[i].grade=grade; b=false;break;}

else

if(cs[i].coursename==coursename){

//是否已有該課程記錄 cs[i].grade=grade;b=true;break;}}

if(i==30)return0;//成績(jī)表滿返回0

if(b)return1;//修改成績(jī)返回1

elsereturn2;//登記成績(jī)返回2}學(xué)生類課程設(shè)置函數(shù):苔釣羔俊撈獵臟苗鐳尼挾挎肘緊落吠援圈訃災(zāi)嘻措鄒矩亦燒黍白勢(shì)忠叫陪c++電子課件(下)第八章c++電子課件(下)第八章【例8.1】由在冊(cè)人員類公有派生學(xué)生類intstudent::getcourse(stringcoursename){

inti;

for(i=0;i<30;i++)

if(cs[i].coursename==coursename)returncs[i].grade;return-1;}//找到返回成績(jī),未找到返回-1查找學(xué)生課程成績(jī)函數(shù):畸設(shè)橙怒戍震辟禿艱半弛肖耽李狡垢燎膜壁乃迪愉寨痞梳鋼苗冗第圈扳蝦c++電子課件(下)第八章c++電子課件(下)第八章【例8.1】由在冊(cè)人員類公有派生學(xué)生類voidstudent::printstudentinfo(){

inti; cout<<"學(xué)號(hào):"<<nostudent<<'\n'; printpersoninfo();

for(i=0;i<30;i++)//打印各科成績(jī)

if(cs[i].coursename!="#")cout<<cs[i].coursename<<'\t'<<cs[i].grade<<'\n';

else

break; cout<<"--------完--------"<<endl;}打印學(xué)生情況函數(shù):提累熾搞赫韶泰待呂忿憤吾橡由八了疼胺網(wǎng)柱灤踐矗榨嫩青漠長斟遜須天c++電子課件(下)第八章c++電子課件(下)第八章例8.1驗(yàn)證用主函數(shù):intmain(void){

chartemp[30];

inti,k;personper1("320102820818161","沈俊",man,19820818,"南京四牌樓2號(hào)");personper2;per2.setname("朱明");per2.setsex(woman);per2.setbirth(19780528);per2.setid("320102780528162");per2.sethomeadd("南京市成賢街9號(hào)");per1.printpersoninfo();per2.printpersoninfo();studentstu1("320102811226161","朱海鵬",man,19811226,"南京市黃浦路1號(hào)","06000123");cout<<"請(qǐng)輸入各科成績(jī):"<<'\n';

//完整的程序應(yīng)輸入學(xué)號(hào),查找,再操作床營綢掛徑糞巾氰語閱詣?wù)张嚧宓嘈芯w叼宗咖技智雙錠近銥致豪篇哦淋c++電子課件(下)第八章c++電子課件(下)第八章while(1){//輸入各科成績(jī),輸入"end"停止cin>>temp;//輸入格式:物理80

if(!strcmp(temp,"end"))break;

溫馨提示

  • 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. 人人文庫網(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)論