參考案例c15-虛機(jī)制_第1頁(yè)
參考案例c15-虛機(jī)制_第2頁(yè)
參考案例c15-虛機(jī)制_第3頁(yè)
參考案例c15-虛機(jī)制_第4頁(yè)
參考案例c15-虛機(jī)制_第5頁(yè)
已閱讀5頁(yè),還剩9頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論