實(shí)例演示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:
- #ifndef classFile_Header_File
- #define classFile_Header_File
- class father
- {
- public:
- virtual void show();
- };
- class son: public father
- {
- public:
- void show();
- void sayhi();
- };
- #endif
這里我們?cè)谧宇愔袑?duì)父類實(shí)現(xiàn)了override(C++沒(méi)有提供override關(guān)鍵字,所以改寫父類的方法要格外小心)。
TestPoly.cpp代碼如下:
- #include<iostream>
- #include"classFile.h"
- using namespace std;
- void hello(father* fp)
- {
- fp->show();
- }
- int main()
- {
- father f;
- hello(&f);
- son s;
- hello(&f);
- }
- inline void father::show()
- {
- cout<<"I am father"<<endl;
- }
- inline void son::show()
- {
- cout<<"I am son"<<endl;
- }
- inline void son::sayhi()
- {
- 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ù)改寫如下:
- void hello(father* fp)
- {
- son* ps=dynamic_cast<son*>(fp);//將fp 轉(zhuǎn)換為son*類型
- if(ps)//如果轉(zhuǎn)換失敗則返回0
- ps->sayhi();
- else
- fp->show();
- }
調(diào)用:
- int main()
- {
- father f;
- hello(&f);//轉(zhuǎn)換失敗,執(zhí)行else
- son s;
- hello(&s); //輸出Hi,I am son
- }
以下這篇博文對(duì)虛函數(shù)表講解非常清楚:
http://blog.csdn.net/hairetz/archive/2009/04/29/4137000.aspx
原文鏈接:http://www.cnblogs.com/DanielZheng/archive/2010/11/22/1884431.html
【編輯推薦】
- C語(yǔ)言對(duì)象編程構(gòu)思
- C語(yǔ)言中的面向?qū)ο笏枷?/span>
- C語(yǔ)言中的DIV的用法及DIVAB概念解析
- 詳解Linux系統(tǒng)下搭建C語(yǔ)言開(kāi)發(fā)環(huán)境
- 妙趣橫生的算法(C語(yǔ)言實(shí)現(xiàn))