




版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、虛機(jī)制虛機(jī)制的引入class Shapepublic: void Show( ) cout“面積是:”Area( )endl; float Area( ) const return 0; ;class Rectangle: public Shape public: Rectangle(float w,float h) mWidth = w; mHeight = h; float Area( ) const return mWidth*mHeight; private: float mWidth, mHeight;class Circle: public Shape public: Circle
2、(float r): mRadius( r ) float Area( ) const return mRadius * mRadius*3.14; private: float mRadius;main( ) Rectangel rect(1,2); Circle cir(1); Shape& sp1 = rect; Shape& sp2 = cir; sp1.Show( ); /輸出是0,為什么? sp2.Show( ); /輸出是0,為什么? 靜態(tài)編聯(lián)和動(dòng)態(tài)編聯(lián)靜態(tài)編聯(lián)(早綁定,靜態(tài)綁定):編譯期間就決定了程序運(yùn)行時(shí)將具體調(diào)用哪個(gè)的函數(shù)體。即使沒有主程序,也能知道程序中各個(gè)函數(shù)體之間的調(diào)
3、用關(guān)系。動(dòng)態(tài)編聯(lián)(晚綁定,動(dòng)態(tài)綁定):只有在運(yùn)行期間,程序才能臨時(shí)決定具體調(diào)用哪個(gè)函數(shù)體。動(dòng)態(tài)編聯(lián)的實(shí)現(xiàn) 多種方式虛擬函數(shù)和虛擬函數(shù)表虛函數(shù)的聲明和定義虛函數(shù)聲明和定義格式(只能是成員函數(shù))聲明: virtual 返回類型 成員函數(shù)名(參數(shù)表)const;定義: 同普通成員函數(shù)定義派生類中的虛函數(shù):繼承自基類的虛函數(shù)新定義的(函數(shù)名不同于基類中的函數(shù))復(fù)寫(也稱重寫,override)名字與基類中的虛函數(shù)同名返回類型,必須與基類函數(shù)的返回值類型相容.虛函數(shù)的聲明定義class Date public: Date(int y,int m,int d ); virtual Date( ) bool
4、 IsLeap( ) const; virtual void Display( ) const protected: int mYear; int mMonth; int mDay;class ChinaDate: public Date public:ChinaDate(int y,int m,int d) :Date(y,m,d) virtual ChinaDate ( ) virtual void Display( ) const coutmYear“年”; coutmMonth“月”; coutmDay“日”endl; protected: / other;class UsaDate:
5、 public Date public: UsaDate(int y,int m,int d) :Date(y,m,d) virtual UsaDate ( ) virtual void Display( ) const coutmMonth“/”; coutmDay“/”; coutmYearDisplay( ); / 12/31/2008delete pDate;虛擬函數(shù)表虛擬表(虛擬函數(shù)表,虛表,VTable)類中至少有一個(gè)虛函數(shù)一個(gè)類有一個(gè)虛擬表,同一個(gè)類的不同對(duì)象共享該虛擬表首次創(chuàng)建該類實(shí)例對(duì)象時(shí),在內(nèi)存中同時(shí)創(chuàng)建該類的虛擬表。虛擬表的表項(xiàng)使用虛擬表實(shí)現(xiàn)動(dòng)態(tài)編聯(lián)的過(guò)程虛擬表實(shí)現(xiàn)動(dòng)態(tài)編
6、聯(lián)的過(guò)程Date應(yīng)用例子:Date * p= new ChinaDate(2008,12,31);p-Display( );delete p;或 void func(Date * p) p-Display( ); Main( ) Date * p= new UsaDate(2008,12,31);Func(p); /輸出 12/31/2008delete p; P = new ChinaDate(2008,12,31);Func(p); /輸出 2008年12月31日delete p;Shape應(yīng)用例子:首先將函數(shù)Area( ) 都改成虛的。Shape * pSh1 = new Rectang
7、e(1,2);Shape * pSh2 = new Circle(3);pSh1-Show( );pSh2-Show( );delete pSh2;delete pSh1;靜態(tài)類型和動(dòng)態(tài)類型變量的靜態(tài)類型和動(dòng)態(tài)類型指針變量:引用變量:對(duì)象變量: 一定是一致的。從編譯到動(dòng)態(tài)綁定靜態(tài)類型的類中必須有此函數(shù),即使永遠(yuǎn)也不調(diào)用。虛函數(shù)的訪問(wèn)虛函數(shù)中訪問(wèn)的非虛函數(shù)靜態(tài)編聯(lián),使用本地版本非虛函數(shù)中訪問(wèn)的虛函數(shù)動(dòng)態(tài)編聯(lián)虛函數(shù)中訪問(wèn)的虛函數(shù)動(dòng)態(tài)編聯(lián)構(gòu)造函數(shù)和虛函數(shù)構(gòu)造函數(shù)不能為虛函數(shù)調(diào)用的虛函數(shù)采用靜態(tài)編聯(lián),使用本地版本析構(gòu)函數(shù)和虛函數(shù)析構(gòu)函數(shù)可以為虛函數(shù)若類中含有虛函數(shù),那么析構(gòu)函數(shù)也應(yīng)為虛函數(shù).調(diào)用的虛函
8、數(shù)采用靜態(tài)編聯(lián),使用本地版本虛函數(shù)訪問(wèn)例class Base public: Base( ) vf( ); virtual Base( ) vf( ); virtual void vf( ) cout“Base:vf( )”endl; virtual void vg( ) cout“Base:vg( )”endl; vf( ); nvh( ); void nvh( ) cout“Base:nvh( )”endl; vf( ); ;class Derived: public Base public: Derived( ) vf( ); virtual Derived( ) vf( ); virt
9、ual void vf( ) cout“Derived:vf( )”endl; void nvh( ) cout“Derived:nvh”vf( );p-vg( );p-nvh( );delete p;抽象類和具體類抽象類和具體類抽象類:不能被實(shí)例化具體類:可以實(shí)例化純虛函數(shù)(一定是成員函數(shù))格式: virtual ReturnType Func(. ) const = 0;抽象類:含有一個(gè)或多個(gè)純虛函數(shù)。純抽象類:全部非靜態(tài)成員函數(shù)均為純虛函數(shù).純虛定義:對(duì)純虛函數(shù)給出缺省實(shí)現(xiàn)(定義)抽象的派生類虛機(jī)制和多態(tài)性(polymorphism)動(dòng)態(tài)決定調(diào)用的具體實(shí)現(xiàn)一個(gè)接口函數(shù)可以通過(guò)派生類有不同
10、的實(shí)現(xiàn)分離了接口和具體實(shí)現(xiàn)給程序提供了擴(kuò)展性RTTI和typeid操作RTTItypeid:typeid(exp) 或 typeid(type_name),返回 const type_info 對(duì)象exp是指針,則返回靜態(tài)類型Exp是類類型(對(duì)象/引用),且含有虛函數(shù),則返回動(dòng)態(tài)類型。class A /*含虛函數(shù)*/ ; class B:public A ; class C:public A ;A * p1 = new B; typeid(p1) = typeid(A*) / TRUE typeid(p1) = typeid(B *) / FALSEtypeid(*p1) = typeid(A) / FALSEtypeid(*p1) = typeid(B) / TRUEdynamic_cast:dynamic_cast(exp)T只能是指針或引用型若T為指針,成功則返回T類型指針;失敗返回NULL.若T為引用,成功則返回T類型引用;失敗產(chǎn)生bad_cast異常。例: class A ; class B:public A ; class C:pubilc A ; A * p1 = new
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 教學(xué)反思如何促進(jìn)學(xué)生主動(dòng)學(xué)習(xí)試題及答案
- 幼兒園數(shù)學(xué)問(wèn)題解決試題及答案
- 新能源汽車的政策導(dǎo)向分析試題及答案
- 月基礎(chǔ)理論試題及答案
- 2025年入黨培訓(xùn)測(cè)試題及答案(一)
- 物流金融服務(wù)在供應(yīng)鏈金融創(chuàng)新中的應(yīng)用場(chǎng)景與風(fēng)險(xiǎn)控制研究
- 絞車運(yùn)輸工試題及答案
- 工業(yè)催化考試題及答案
- 教育大數(shù)據(jù)在2025年教育行業(yè)數(shù)據(jù)驅(qū)動(dòng)戰(zhàn)略規(guī)劃中的應(yīng)用研究
- 環(huán)境監(jiān)測(cè)面試真題及答案
- 模擬退火與數(shù)論-深度研究
- 駕照考試科目一試題900題(含標(biāo)準(zhǔn)答案)022506
- 水利項(xiàng)目立項(xiàng)報(bào)告
- 幼兒園初級(jí)保育員考試題庫(kù)(附答案)
- 【MOOC】航空燃?xì)鉁u輪發(fā)動(dòng)機(jī)結(jié)構(gòu)設(shè)計(jì)-北京航空航天大學(xué) 中國(guó)大學(xué)慕課MOOC答案
- 家政服務(wù)人員崗前培訓(xùn)
- 國(guó)家生物安全培訓(xùn)課件
- 專題11 名著閱讀之《童年》(考題猜想)(期中真題速遞20題)(含答案解析)
- TSGD7002-2023-壓力管道元件型式試驗(yàn)規(guī)則
- 無(wú)人機(jī)組裝與調(diào)試 課件全套 項(xiàng)目1-3 無(wú)人機(jī)組裝調(diào)試基礎(chǔ)、多旋翼無(wú)人機(jī)組裝與調(diào)試、垂直起降無(wú)人機(jī)組裝調(diào)試
- (完整版)第八章財(cái)務(wù)報(bào)表分析習(xí)題及答案
評(píng)論
0/150
提交評(píng)論