![面向對象與visual c程序設計案例教程_第1頁](http://file4.renrendoc.com/view/46da1eadbdbdca57c28aa9ead722b968/46da1eadbdbdca57c28aa9ead722b9681.gif)
![面向對象與visual c程序設計案例教程_第2頁](http://file4.renrendoc.com/view/46da1eadbdbdca57c28aa9ead722b968/46da1eadbdbdca57c28aa9ead722b9682.gif)
![面向對象與visual c程序設計案例教程_第3頁](http://file4.renrendoc.com/view/46da1eadbdbdca57c28aa9ead722b968/46da1eadbdbdca57c28aa9ead722b9683.gif)
![面向對象與visual c程序設計案例教程_第4頁](http://file4.renrendoc.com/view/46da1eadbdbdca57c28aa9ead722b968/46da1eadbdbdca57c28aa9ead722b9684.gif)
![面向對象與visual c程序設計案例教程_第5頁](http://file4.renrendoc.com/view/46da1eadbdbdca57c28aa9ead722b968/46da1eadbdbdca57c28aa9ead722b9685.gif)
版權說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權,請進行舉報或認領
文檔簡介
C++中,本章主要介紹單一繼承中類的定義和使用方式以及類構造函數(shù)和析構函數(shù)的調用順序,對多重繼承也將做簡單介紹。在多態(tài)性方面主要介紹多態(tài)性的概念及其實現(xiàn)的關鍵技系統(tǒng)應該可以運行在市面上流行的任何一款數(shù)據(jù)庫管理系統(tǒng)上,如Access、MySQL、SQLServer等。所有的數(shù)據(jù)庫管理系統(tǒng)使用之前都要連接,使用完成后要斷開連接。不同 //操作Access數(shù)據(jù)庫 //操作MySQL數(shù)據(jù)庫 Account_DB_Access、Account_DB_MySQLAccount_DB_SQLServer都分關系,如圖4.1所示。過下面的代碼來Account_DB_Access的connect()函數(shù)。4.1 Account_DB*db= intint{Account_DB_MySQLdb_Mysql;}Account_DBconnect(),則會導致編譯connect()成員函數(shù)。在上例中,pdbAccount_DB_Access對象、Account_DB_MySQLAccount_DB_SQLServer對象。在執(zhí)行期間的每個調用點上,pdbconnect()實例,這稱為動態(tài)綁定。public級別的劃分上對于實現(xiàn)細節(jié)的一般性,C++供了另一種級別:protected。一個類的d區(qū)域中的數(shù)據(jù)成員和成員函數(shù),對一般程序是不可的,而對于派生類是可的。為d是e該類的派生類直接其成員,則把它為private。如果希望一個成員為“后來的、要求這個成員為protected。class{virtualboolconnect()class{virtualboolconnect() }{returnclassclass{virtualboolconnect(0Account_DB最基本的兩個功能——連接和斷開連接開始,在后續(xù)章節(jié)中提供的操作,所以必須在Account_DB類定義中為虛擬的,每個派生類必須重寫這個函數(shù),以提供自己的連接數(shù)據(jù)庫方式。Account_DB基類提供公有接口供編程使用。Account_DB中定義為一個唯一的實例(非虛擬函數(shù)),讓每個子類繼承該操作。在這種設計{ }類型。由此定義出Account_DB類的第一個版本。class{virtualboolconnect()=0; virtualbooldisconnect()=0; bool 基類Account_DB將函數(shù)connect()成純虛函數(shù),那是因為沒有有意義的通用連接Account_DB中提供定義(Account_DB類的最后版本中該函數(shù)也是純虛"classAccount_DB_Access:public"classAccount_DB_Access:public{boolAccount_DB_Access還可以增加自己特有的處理函數(shù)和數(shù)據(jù)。connect()等成員函數(shù)的定義涉及到數(shù)據(jù)庫相關知識,所以將在后續(xù)的相關章節(jié)中完成 classderived_class:access_level 其中:class為關鍵字,表示要新建一個類類型,derived_class是新建子類的名稱。冒號之后稱為派生表,base_class是父類或基類的名字。access_levelpublic、protected或private之一,表示子類到父類的派生方式,如上述定義中表明類Account_DB_Access從Account_DB類公有派生?;惪梢灾挥幸粋€(單一繼承),也可以有多個(多重繼承),有多數(shù)據(jù)成員構成的。例如Account_DB_Access類對象由Account_DB子對象以及bool{cout<<"hostname:"<<_host<<endl;cout<<"dbname:"<<_db_name<<endl;cout<<"username:"<<_user<<endl;returntrue;}bool{cout<<"hostname:"<<_host<<endl;cout<<"dbname:"<<_db_name<<endl;cout<<"username:"<<_user<<endl;returntrue;}boolboolclassclass{ classShy:public{string_mumbleDiffident::_mumbleShy的作用域中,非限定修飾地使用_mumbleShystringvoidvoid{_mumbleexcuseme"}類的成員。例如,下面是turn_eyes_down()的正確實現(xiàn):voidvoid{_mumble="excuseme";//正確Diffident::_mumble1正確:限定修飾基類的實例}classclass{voidmumble(intclassShy:public{ShyShyclass{voidclass{voidclassShy:public{classclass{從Account_DB派生的類可以直接數(shù)據(jù)成員_host,而在基類和派生類的外部不可 另一個獨立的基類對象的protected成員,例如:voidvoid y(constAccount_DB{cout<<"hostname:"<<_host<<endl;//正確 自己的Account_DB子對象 }考慮下列初始化,用一個派生類Account_DB_Access對象的地址初始化一個Account_DB*Account_DB*pdb=newAccount_DB_Access Account_DB_Access的成員如果Account_DB和Account_DB_Access都 通過pdb調用的總是Account_DB的實例。則通過pdb總是Account_DB的實例。圖通過pdb調用它就會導致一個編譯時刻錯誤。如果試圖通過pdbAccount_DB_Access的數(shù)據(jù)成員或非虛擬成員函數(shù),也會總之,在C++中,基類指針只能在該基類中被(或繼承)的數(shù)據(jù)成員和成員函pdb指向的實際類類型對于要調用的實例的解析過程”。Account_DBAccount_DB_Access會創(chuàng)建第2個靜態(tài)成員的實例嗎?答案是否定的,所有派生類對象都相同的、單一的、classAccount_DB_Access:public{//... classAccount_DB_Access:public{//... 象由一個Account_DB子對象和一個string成員類對象以及一個bool成員構成。 Account_DB_Access 便初始化基類數(shù)據(jù)成員、string默認構造函數(shù)以便初始化數(shù)據(jù)成員_name,以及Account_DB_Access的默認構造函數(shù)以便初始化_present。Account_DB2位,但是它總是在“與_name相關class{的string構造函數(shù)被自動調用。下面是Account_DB類構造函數(shù)的定義:Account_DB類來說意義不大,因為一個沒有指定類中數(shù)據(jù)Account_DB::Account_DB(constAccount_DB::Account_DB(conststring&db_name,conststring&user,conststring&passwd,conststring&host,constint&port)Account_DB類的構造函數(shù)分別把傳過來的參數(shù)通過初始化成員列表傳遞給現(xiàn)在有個問題:應該把構造函數(shù)成什么樣的級別?因為Account_DB類對象publicAccessclass{passwd="",conststring&host="",constint&port=0);SLServerOracleclass{passwd="",conststring&host="",constint&port=0);classAccount_DB_Access:public{Account_DB_Access(constclassAccount_DB_Access:public{Account_DB_Access(conststring&db_name,conststring&user="",conststring&passwd="",conststring&host="",constint&port=0);user,conststring&passwd,conststring&host,constint&port)Account_DB_AccessAccount_DB_AccessAccount_DB的基Account_DB_AccessAccount_DB_Access資源,所以不需要提供顯式的析構函數(shù)來釋放資源。對于基類Account_DB中的_passwd,_user和_db_namestring的析構函數(shù)來清除它們所占用的內(nèi)void void cout<<pb->IsUserExit()Account_DB的非虛擬成員函數(shù)Account_DB_Accessdba("PTPS_DB","PTPS_Name","PTPS_Passwd");Account_DBdbdbaAccount_DB_Accessdba("PTPS_DB","PTPS_Name","PTPS_Passwd");Account_DBdbdbadba被"切割"Account_DB子對象boolboolg_connect(Account_DBobj,Account_DB*pobj,Account_DB&{robj.connect()connect()實例returntrue;}int{Account_DB_Accessdba;g_connect(dba,&dba,dba);}通過pobj和robj的調用被解析為它們的動態(tài)類型,在這個例子中,它們都調用系統(tǒng)相關聯(lián)的類。因此現(xiàn)在定義了3個實體類類型:Account_DB_Access,{returntrue;}Account_DB{returntrue;}Account_DB類的公有接口的目的是,定義一組“足夠支持當前和將來的所有數(shù) Account_DB*pdb=newAccount_DB*pdb2newAccount_DB錯誤:new表達式分配Account_DBAccount_DB*pdb=newAccount_DB*pdb=newpdb->isA();//通過虛擬機制動態(tài)調用Account_DB_Access::isA()實例class{virtualvoidprint()=Account_DB以及它的派生類中Account_DBclass{virtualvoidprint()=Account_DB中定義print()voidvoidclassAccount_DB_Access:public{classAccount_DB_Access:public{}void{cout<<"Account_DB_Access::print()"<<endl;}{(constchar*n,constint&{name=newchar[strlen(n)+1];} classstudent:{student(constchar*n,constchar*p,constint&{profession=newchar[strlen(p)+1];strcpy(profession,p);} void*pb){delete{virtual//{virtual//析構函數(shù)。例如,如果pb指向一個student對象,則下面的語句: delete {virtualclassstudent{virtualclassstudent:{當通過student對象調用student析構函數(shù)時,它的 級別是public,但是,當通過intint{*pq=newstudent(" ","計算機科學技術系",25);deletepq;// :析構函數(shù)是protected}所以作為一般規(guī)則,建議將類層次結構的根基類的析構函數(shù)為虛擬的,級別一般為public。在實際的C++應用程序中,主要的繼承模型是“單個基類的公有繼承”模型。一般可它提供的模型會增加不必要的復雜性,而且不直觀。此時,多繼承,或者它的特例——虛園動物類(ZooAnimal)和瀕臨動物類(Endangered)。類(Bear)ZooAnimal類派生而來,熊貓種類(Panda)Bear類和Endangered4.2 classBear:public 每個被列出的基類還必須指定其級別:public、protectedprivate之一。與單繼承一樣,只有當一個類的
4.2多繼承PandaPanda ying_yang由一個Bear類子對象它又含有一個ZooAnimal基類子對象)、一個EndangeredPanda類中ying_yang來說,構造函數(shù)被調用的順序是:Bear構造函數(shù)(BearZooAnimalBear構造函數(shù)執(zhí)行之前,ZooAnimal的構造函數(shù)先被調用),EndangeredPandaBearEndangered的雙參數(shù)構造函數(shù)之前被調用。如,如果BearEndangered中都定義了一個非私有成員函數(shù)print(),則如下語句:print()調用,或對象。對于多繼承,這也是正確的。例如,一個Panda指針、或對象可以被 Error:dis y(ying_yang Error:dis y(ying_yang)--ambiguous,oneofexternvoiddis y(constBear&);externvoid y(constPanda externexternvoid y(constexternvoidhighlight(constEndangered&);externvoidprint(constZooAnimal&);Pandaying_yang; print(ying_yang);//正確externvoidy(constexternvoidy(constPanda的每個classclass{virtualclassBear:public{virtualvirtualvoidprint()const;virtualboolisA()const;class{virtual~Endangered();virtualvoidprint()const;virtualvoidhighlight()classclassPanda:publicBear,public{virtualvirtualvoidprint()const;virtualvoidcuddle();print()isA()highlight()接口中“Panda特有的部分”以及“Endangered部分”就不能再被了。例如:Bear*Bear*pb=newPanda;deletepb;錯誤:不是Bear接口的部分錯誤:不是Bear接口中“Panda特有的部分”以及“Bear部分”就不能再被了。例如:Endangered*Endangered*pe=newpe->print();//pe->isA();//錯誤:不是Endangered的接口部分pe->cuddle();//錯誤:不是Endangered的接口部分pe->highlight()Endangered::highlight()deletepe;//正確:Panda::~Panda()ZooAnimal*ZooAnimal*pz=newPanda;deletepz;Bear*pb=newPanda;deletepb;Panda*pp=newPanda;deletepp;Endangered*pe=newdeletePanda析構函數(shù)通過虛擬機制調用,再靜態(tài)調用Endangered、BearZooAnimal的析構函classclassBear:publicBearZooAnimalclassclassPolarBear:public象的所有非靜態(tài)數(shù)據(jù)成員和ZooAnimal子對象的所有非靜態(tài)數(shù)據(jù)成員。明顯的就是標準C++的輸入/輸出流類庫:iostream庫,其層次結構如圖4.3所示。4.3iostream任何未限定修飾地ios的成員都將導致編譯時刻錯誤。被消除了。參看如圖4.4所示的虛擬繼承Panda層次結構圖。4.4Panda和Raccoon沒有實現(xiàn)虛擬派生,則Panda類就不能在實際中應用了。classBearpublicvirtualZooAnimal{...publicvirtualclassBearpublicvirtualZooAnimal{...publicvirtual的順序classRaccoon:virtualpublic盡管Panda被設計為虛擬繼承層次結構,下面的Panda基類轉換也可以正確執(zhí)行。externvoiddance(constBear*);externexternvoiddance(constBear*);externvoidrummage(constRaccoon*);externvoidprint(constZooAnimal&);voidmain(){Pandayin_yang;print(yin_yang);//正確}class{class{virtual~ZooAnimal();virtualvoidprint()const;stringname()const{returnstringfamily_name()const{return_fam_name;} 是Bear類的定義:classclassBear:publicvirtual{enumDanceType{two_left_feet,macarena,fandango,waltz};Bear(stringname,boolonExhibit=true):ZooAnimal(name,onExhibit,"Bear"),_dance(two_left_feet){}virtualvoidprint()const; classclassRaccoon:publicvirtual{Raccoon(stringname,bool:ZooAnimal(name,onExhibit,"Raccoon"),_pettable(false){}virtualvoidprint()const;boolpettable()const{returnvoidpettable(boolpetval){_pettable=petval;} classPanda:publicBear,publicRaccoon,classPanda:publicBear,publicRaccoon,public{Panda(stringname,boolonExhibit=true);virtualvoidprint()const;boolsleevoid()const{return_slee(boolnewval){_slee=;BearRaccoon的基類構造函數(shù)都提供了一個帶有顯式實參集合的虛擬派生中,只有Panda可以直接調用其虛擬基類的構造函數(shù)。Bear定義來決定的。例如,在BearBearRaccoonRaccoonPanda現(xiàn)在,在定義Panda函數(shù)的調用不再被執(zhí)行;②ZooAnimalPanda的初始化列表中被指定的。下面是Panda構造函數(shù)的具體定義::ZooAnimal(name,onExhibit,"Panda"),Bear(name,onExhibit),Raccoon(name,onExhibit), PandaZooAnimal構造函數(shù)指定實參,則會發(fā)生下面兩ZooAnimal的默認構造函數(shù),②如果沒有默認構造函數(shù)
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年高速彈力絲加捻機配件行業(yè)深度研究分析報告
- 畢業(yè)作品《暗·涌》中“五聲化十二音”技法應用研究
- 柜員專用驗鈔機行業(yè)深度研究報告
- 2025年方型低頻電源變壓器項目投資可行性研究分析報告
- 生態(tài)旅游區(qū)中的多模式交通規(guī)劃
- 困難低保申請書
- 電子煙行業(yè)中的跨界合作與共贏策略
- 電商平臺客戶支持體系創(chuàng)新與發(fā)展
- 乙肝患者購買合同范例
- 現(xiàn)代企業(yè)中的人際關系管理策略研究
- 學校小賣部承包合同范文
- 普外腹腔鏡手術護理常規(guī)
- 2025年湖南鐵道職業(yè)技術學院高職單招職業(yè)技能測試近5年??及鎱⒖碱}庫含答案解析
- 2024年全國職業(yè)院校技能大賽(礦井災害應急救援賽項)考試題庫(含答案)
- 《預制高強混凝土風電塔筒生產(chǎn)技術規(guī)程》文本附編制說明
- 2025年浙江省溫州樂清市融媒體中心招聘4人歷年高頻重點提升(共500題)附帶答案詳解
- 2025年煤礦探放水證考試題庫
- C語言程序設計 教案
- 農(nóng)業(yè)機械設備運輸及調試方案
- 2025新譯林版英語七年級下單詞表
- 海洋工程設備保溫保冷方案
評論
0/150
提交評論