自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

實(shí)例演示C++多態(tài)的實(shí)現(xiàn)過(guò)程

開(kāi)發(fā) 后端
對(duì)于多態(tài)很多人還是不太了解,今天我們將通過(guò)實(shí)例來(lái)向大家演示一下C++多態(tài)的實(shí)現(xiàn)過(guò)程。

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

我們知道,子類的指針是可以隱式轉(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++沒(méi)有提供override關(guān)鍵字,所以改寫父類的方法要格外小心)。

TestPoly.cpp代碼如下:

  1. #include<iostream>   
  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"<<endl;   
  21. }  
  22.  
  23. inline void son::show()   
  24. {   
  25.     cout<<"I am son"<<endl;   
  26. }  
  27.  
  28. inline void son::sayhi()   
  29. {   
  30.     cout<<"Hi, I am son"<<endl;   

這里,傳入父類的指針將調(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í)存在與子類的方法表中。

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

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

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

  1. void hello(father* fp)   
  2. {   
  3.     son* ps=dynamic_cast<son*>(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語(yǔ)言對(duì)象編程構(gòu)思
  2. C語(yǔ)言中的面向?qū)ο笏枷?/span>
  3. C語(yǔ)言中的DIV的用法及DIVAB概念解析
  4. 詳解Linux系統(tǒng)下搭建C語(yǔ)言開(kāi)發(fā)環(huán)境
  5. 妙趣橫生的算法(C語(yǔ)言實(shí)現(xiàn))

 

責(zé)任編輯:彭凡 來(lái)源: 博客園
相關(guān)推薦

2009-09-01 18:29:10

C#繼承C#多態(tài)

2010-02-03 10:50:33

C++多態(tài)

2011-04-12 10:40:04

C++多態(tài)

2011-07-15 00:47:13

C++多態(tài)

2010-01-28 16:16:32

C++多態(tài)性

2011-04-06 08:57:07

C++java多態(tài)

2010-06-01 16:50:29

MySQL存儲(chǔ)過(guò)程

2015-03-23 10:04:43

c++編譯器c++實(shí)現(xiàn)原理總結(jié)

2011-12-25 15:35:05

ibmdwJavaC++

2009-08-18 10:17:25

C#枚舉類型

2009-07-15 10:47:32

Java多態(tài)

2010-05-26 17:57:44

MySQL 觸發(fā)器

2021-06-10 09:40:12

C++性能優(yōu)化Linux

2024-04-22 13:22:00

虛函數(shù)象編程C++

2024-01-23 10:13:57

C++虛函數(shù)

2009-08-18 13:30:01

C#安裝與部署

2009-08-26 15:35:59

C#虛函數(shù)

2010-02-05 16:07:52

C++多態(tài)覆蓋

2024-04-29 07:48:04

C++FinalOverride

2009-08-13 18:26:35

C#繼承構(gòu)造函數(shù)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)