freepeople性欧美熟妇, 色戒完整版无删减158分钟hd, 无码精品国产vα在线观看DVD, 丰满少妇伦精品无码专区在线观看,艾栗栗与纹身男宾馆3p50分钟,国产AV片在线观看,黑人与美女高潮,18岁女RAPPERDISSSUBS,国产手机在机看影片

正文內(nèi)容

c程序設(shè)計教程:第9章-多態(tài)性和虛-在線瀏覽

2024-11-05 16:15本頁面
  

【正文】 ircle::area()? 根據(jù)第 6章的賦值兼容性規(guī)律 , 應(yīng)該調(diào)用基類的 area函數(shù) , 輸出為 0。 下面再從內(nèi)存分配原理入手 , 深入討論一下賦值兼容規(guī)律 。 圖 Point的對象 a和 Circle對象 c的內(nèi)存分配關(guān)系示意圖 ? 由此可見 , 對象的內(nèi)存地址空間中只包含數(shù)據(jù)成員 , 并不存儲有關(guān)成員函數(shù)的信息 。 編譯器只根據(jù)數(shù)據(jù)類型翻譯成員函數(shù)的地址并判斷調(diào)用的合法性 。 Circle* pCircle。 圖 Point和派生類 Circle與指針聲明的關(guān)系 ? 由此可見 , 聲明的基類指針只能指向基類 , 派生類指針只能指向派生類 。 除非派生類沒有基類的同名函數(shù) , 派生類的指針才根據(jù)繼承原則調(diào)用基類的函數(shù) , 但這已經(jīng)脫離給定的條件 。c。 //(4) ? 雖然 p用 c的地址初始化,但也是枉然。因此 (4)的輸出是 0。這完全符合賦值兼容性規(guī)則。 動態(tài)聯(lián)編的多態(tài)性 ? 如果讓編譯器動態(tài)聯(lián)編,也就是在編譯 “ Point *p=amp。 ”語句時,只根據(jù)兼容性規(guī)則檢查它的合理性,也就是符合 “ 派生類對象的地址可以賦給基類的指針 ” 。說到底,想讓程序給出如下輸出: area of Point is 0 area of Circle is area of Circle is area of Circle is 為了實現(xiàn)這一目的 , 就要使類 Point的指針 p指向派生類函數(shù) area的地址 。必須給這兩個函數(shù)一個新的標(biāo)識符 , 以便使它們與目前介紹的成員函數(shù)區(qū)別開來 。 下面是使用內(nèi)聯(lián)函數(shù)完成的定義: virtual double area( ){ return 。此外,編譯器也為類增加一個數(shù)據(jù)成員,這個數(shù)據(jù)成員是一個指向該虛函數(shù)表的指針,通常稱為 vptr。圖 。編譯器為含有虛函數(shù)類的對象首先建立一個入口地址,這個地址用來存放指向虛函數(shù)表的指針 vptr,然后按照類中虛函數(shù)的聲明次序,一一填入函數(shù)指針。 ? 派生類能繼承基類的虛函數(shù)表 , 而且只要是和基類同名的 (參數(shù)也相同 )成員函數(shù) , 無論是否使用virtual聲明 , 它們都自動成為虛函數(shù) 。 如果派生類改寫了基類的虛函數(shù) ,編譯器將重新為派生類的虛函數(shù)建立地址 , 則函數(shù)指針調(diào)用這個改寫過的虛函數(shù) 。 ? 虛函數(shù)的調(diào)用規(guī)則是: 根據(jù)當(dāng)前對象 , 優(yōu)先調(diào)用對象本身的虛成員函數(shù) 。 顯然 , 程序運行到語句 parea()。 虛 函 數(shù) 虛函數(shù)是實現(xiàn)多態(tài)性的基礎(chǔ)。 虛函數(shù)的定義 為實現(xiàn)某種功能而假設(shè)的函數(shù)稱作虛函數(shù) 。 例如: class A { public: virtual void fun( )。 void A::fun( ) { ......// } //定義虛函數(shù) ? 當(dāng)在派生類中定義了一個同名的成員函數(shù)時 , 只要該成員函數(shù)的參數(shù)個數(shù)和相應(yīng)類型以及它的返回類型與基類中同名的虛函數(shù)完全一樣 ( 例如void area(void) 函數(shù) ) , 則無論是否為該成員函數(shù)使用 virtual, 它都將成為一個虛函數(shù) ?!保?則派生類 Circle中的area函數(shù)自動成為虛函數(shù) 。 這種多態(tài)性是程序運行到此處才動態(tài)確定的 , 所以稱為運行時的多態(tài)性 。 例如 , 在調(diào)用中對虛函數(shù)使用成員名限定 , 可以強制 C++ 對該函數(shù)的調(diào)用使用靜態(tài)聯(lián)編 。 (2) 改寫了同名虛函數(shù) 。 ? 滿足前兩條并不一定產(chǎn)生動態(tài)聯(lián)編 , 必須有第 3條才能保證實現(xiàn)動態(tài)聯(lián)編 。第 1種是已經(jīng)演示過的按賦值兼容性定義使用基類指針 (或引用 )訪問虛函數(shù) 。 下面的例子是設(shè)計一個外部函數(shù) display, 通過指針 (或引用 )實現(xiàn)多態(tài)性的完整程序 。 分析下面程序的輸出結(jié)果: include iostream using namespace std。 class Point { private: double x,y。 y=j。 } }。 public: Circle(double a, double b,double r) :Point(a,b) { radius=r。 } }。} //使用引用 void display(Pointamp。} void main() { Point a(,)。 Point *p=amp。 Point amp。 display(a)。 display(rc)。 進一步探討虛函數(shù)與實函數(shù)的區(qū)別 ? 假設(shè)基類和派生類都只有一個公有的數(shù)據(jù)成員 , 其中類A有 vfunc1和 vfunc2兩個虛函數(shù)和 func1和 func2兩個實函數(shù) 。 類 C也改寫 vfunc1和func1函數(shù) 。 ? 首先給 vptr分配地址,它所占字節(jié)數(shù)決定對象中最長數(shù)據(jù)成員的長度。如果有 double型的數(shù)據(jù),則要分配 8個字節(jié)。 圖 實函數(shù)和虛函數(shù)的圖解示意圖 從圖中可見 , 對象的起始地址是 vptr。 如果派生類改寫了基類的虛函數(shù) ,則調(diào)用自己的虛函數(shù) , 這就是 b和 c的 vtable表中(*vfunc1)( )項所描述的情況 。 【 例 】 是程序?qū)崿F(xiàn) 。 include iostream using namespace std。 A(int a){m_A=a。} void func2(){coutA::func2( )endl。} virtual void vfunc2(){coutA::vfunc2( )endl。 class B:public A{ public: int m_B。} void vfunc1(){coutB::vfunc1( )endl。 class C:public B{ public: int m_C。} void vfunc1(){coutC::vfunc1( )endl。 void main() { //輸出類的長度 ( 字節(jié)數(shù) ) coutsizeof(A),sizeof(B).sizeof(C)endl。 B b(21,22)。 //輸出類的首地址及數(shù)據(jù)成員地址 , 驗證首地址是 //vptr地址 coutamp。()endl。b,amp。endl。c,amp。 , amp。 //使用基類指針 A* pa=amp。 //pa指向基類 A pavfunc1()。 //調(diào)用 A::vfunc2( ) pafunc1()。 //調(diào)用 A::vfunc2
點擊復(fù)制文檔內(nèi)容
化學(xué)相關(guān)推薦
文庫吧 www.dybbs8.com
備案圖鄂ICP備17016276號-1