日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
實(shí)例演示C++多態(tài)的實(shí)現(xiàn)過程

多態(tài)描述的是使用基類的指針或引用操作多個(gè)類型的能力。

創(chuàng)新互聯(lián)自成立以來,一直致力于為企業(yè)提供從網(wǎng)站策劃、網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、電子商務(wù)、網(wǎng)站推廣、網(wǎng)站優(yōu)化到為企業(yè)提供個(gè)性化軟件開發(fā)等基于互聯(lián)網(wǎng)的全面整合營(yíng)銷服務(wù)。公司擁有豐富的網(wǎng)站建設(shè)和互聯(lián)網(wǎng)應(yīng)用系統(tǒng)開發(fā)管理經(jīng)驗(yàn)、成熟的應(yīng)用系統(tǒng)解決方案、優(yōu)秀的網(wǎng)站開發(fā)工程師團(tuán)隊(duì)及專業(yè)的網(wǎng)站設(shè)計(jì)師團(tuán)隊(duì)。

我們知道,子類的指針是可以隱式轉(zhuǎn)化為父類的,所以我們?cè)谶M(jìn)行程序設(shè)計(jì)的時(shí)候如果要對(duì)一個(gè)未知的類型進(jìn)行處理,可以在方法聲明時(shí)把參數(shù)的類型聲明為父類的指針。

這要我們就是實(shí)現(xiàn)了根據(jù)傳入的類型執(zhí)行不同的方法。這里的關(guān)鍵是子類在重寫父類的虛方法時(shí)是在虛方法表的相應(yīng)位置對(duì)父類虛方法實(shí)現(xiàn)覆蓋。

舉個(gè)例子:

頭文件classFile.h:

 
 
 
  1. #ifndef classFile_Header_File   
  2. #define classFile_Header_File   
  3. class father   
  4. {   
  5. public:   
  6.     virtual void show();   
  7. };   
  8. class son: public father   
  9. {   
  10. public:   
  11.     void show();   
  12.     void sayhi();   
  13. };   
  14. #endif 

這里我們?cè)谧宇愔袑?duì)父類實(shí)現(xiàn)了override(C++沒有提供override關(guān)鍵字,所以改寫父類的方法要格外小心)。

TestPoly.cpp代碼如下:

 
 
 
  1. #include   
  2. #include"classFile.h"   
  3. using namespace std;  
  4.  
  5. void hello(father* fp)   
  6. {   
  7.         fp->show();   
  8. }   
  9. int main()   
  10. {   
  11.     father f;   
  12.     hello(&f);   
  13.     son s;   
  14.     hello(&f);  
  15.  
  16. }  
  17.  
  18. inline void father::show()   
  19. {   
  20.     cout<<"I am father"<
  21. }  
  22.  
  23. inline void son::show()   
  24. {   
  25.     cout<<"I am son"<
  26. }  
  27.  
  28. inline void son::sayhi()   
  29. {   
  30.     cout<<"Hi, I am son"<

這里,傳入父類的指針將調(diào)用father::show(),傳入子類的指針時(shí),雖然進(jìn)行了隱式的類型轉(zhuǎn)化,但是由于子類在其繼承的虛方法表中相應(yīng)的位置覆蓋了父類的show()方法,所用調(diào)用的實(shí)際上son::show()的內(nèi)容。此時(shí)子類的方法表中不存在father::show()了,如果我們把virtual關(guān)鍵字去掉,那么father::show()和son::show()將同時(shí)存在與子類的方法表中。

那么如果子類做了父類沒用做的事情,我們應(yīng)如何調(diào)用了?

比如這里,我們的子類中實(shí)現(xiàn)了sayhi()方法,這是父類指針father*無法獲取到的地址(實(shí)際是無法直接獲取到,通過手動(dòng)的指針偏移還是可以的,不知道是C++的優(yōu)點(diǎn)還是缺點(diǎn)),這個(gè)地方,如果我們能夠通過實(shí)際傳入的對(duì)象指針類型進(jìn)行操作就OK了。還好C++為我們提過了這個(gè)功能,那就是引入關(guān)鍵字dynamic_cast。

我們把hello()函數(shù)改寫如下:

 
 
 
  1. void hello(father* fp)   
  2. {   
  3.     son* ps=dynamic_cast(fp);//將fp 轉(zhuǎn)換為son*類型   
  4.     if(ps)//如果轉(zhuǎn)換失敗則返回0   
  5.         ps->sayhi();   
  6.     else   
  7.         fp->show();   

調(diào)用:

 
 
 
  1. int main()   
  2. {   
  3.     father f;   
  4.     hello(&f);//轉(zhuǎn)換失敗,執(zhí)行else   
  5.     son s;   
  6.     hello(&s); //輸出Hi,I am son  
  7.  

以下這篇博文對(duì)虛函數(shù)表講解非常清楚:

http://blog.csdn.net/hairetz/archive/2009/04/29/4137000.aspx

原文鏈接:http://www.cnblogs.com/DanielZheng/archive/2010/11/22/1884431.html

【編輯推薦】

  1. C語言對(duì)象編程構(gòu)思
  2. C語言中的面向?qū)ο笏枷?/li>
  3. C語言中的DIV的用法及DIVAB概念解析
  4. 詳解Linux系統(tǒng)下搭建C語言開發(fā)環(huán)境
  5. 妙趣橫生的算法(C語言實(shí)現(xiàn))

網(wǎng)站欄目:實(shí)例演示C++多態(tài)的實(shí)現(xiàn)過程
文章出自:http://www.dlmjj.cn/article/djeppdi.html