新聞中心
C++編程語(yǔ)言中有一種比較特殊的函數(shù)叫做虛函數(shù)。我們應(yīng)該如何正確的理解C++虛函數(shù)呢?在這里我們將會(huì)針對(duì)這一方面的基本概念進(jìn)行一個(gè)詳細(xì)的介紹,希望能給大家?guī)?lái)一些幫助,提高對(duì)C++語(yǔ)言的認(rèn)知程度。

老鳥(niǎo)級(jí)的C++編程高手我想都掌握了虛函數(shù)的作用(哇,我沒(méi)說(shuō)自己是老鳥(niǎo)),但新手我想定是看虛函數(shù)一章有點(diǎn)頭疼,或看懂了但在實(shí)際中用不出來(lái),別急,讓我來(lái)說(shuō)上一回。
何為虛函數(shù)?C++虛函數(shù)就是被關(guān)鍵字virtaul說(shuō)明的函數(shù)。
舉個(gè)例子:
這個(gè)例子中WindowB和WindowC不同時(shí)存在,這在實(shí)際應(yīng)用中是常有的情況,為了節(jié)省內(nèi)存。
- class WindowA
- {
- public:
- virtual void Draw(){};
- };
- class WindowB:public WindowA
- {
- public:
- WindowB(){};
- void Draw();
- };
- class WindowC:public WindowA
- {
- public:
- WindowC(){};
- void Draw();
- };
- void WindowB::Draw()
- {
- 畫(huà)一個(gè)圓;
- }
- void WindowC::Draw()
- {
- 畫(huà)一個(gè)正方形;
- }
當(dāng)在定義WindowA時(shí),不確定它的派生類(lèi)WindowB和WindowC在Draw函數(shù)中要畫(huà)什么,這時(shí)把Draw定義成C++虛函數(shù),在派生類(lèi)中具體實(shí)現(xiàn)。
說(shuō)到這,讀者會(huì)問(wèn):那我把Draw在WindowB和WindowC中寫(xiě)好,還會(huì)少寫(xiě)一個(gè)類(lèi)WindowA。
是的,是少寫(xiě)了,如你所說(shuō),你會(huì)如此使用:
- WindowB* b = new WindowB;
- b->Draw(); //畫(huà)個(gè)圓
- delete b;
- WindowC* c = new WindowC;
- c->Draw(); //畫(huà)個(gè)正方形
- delete c;
我這里用指針實(shí)現(xiàn),在上面的代碼中,b和c是兩個(gè)獨(dú)立的對(duì)象的指針。但如果派生類(lèi)不是一兩個(gè),而是幾十個(gè),幾百個(gè),那你該怎么辦呢?在頭文件中定義幾百個(gè)變量?
非也,到時(shí)候用C++虛函數(shù)的作用了:
- WindowA* a = new WindowsB;
- a->Draw(); //畫(huà)個(gè)圓,此處調(diào)用了WindowB中的Draw函數(shù)實(shí)現(xiàn)
- if(a)
- delete a; //new 出來(lái)的一定要delete
- WindowA* a=new WindowC;
- a->Draw(); //畫(huà)個(gè)正方形,此處調(diào)用了WindowC中的Draw函數(shù)實(shí)現(xiàn)
- if(a)
- delete a;
在上面的代碼中,a實(shí)現(xiàn)了一個(gè)中轉(zhuǎn)變量的作用,只要是從WindowA派生的,我都能賦值給a,而b和c都是臨時(shí)變量。再來(lái)多少個(gè)WindowA的派生類(lèi)都沒(méi)問(wèn)題了,我只要在頭文件中定義一個(gè)WindowA的指針變量就行了。
【編輯推薦】
- C++ Traits應(yīng)用技巧分享
- C++靜態(tài)構(gòu)造函數(shù)相關(guān)概念解析
- C++框架如何正確理解
- C++跨平臺(tái)應(yīng)用編譯方法詳解
- C++文件操作具體應(yīng)用函數(shù)介紹
分享題目:C++虛函數(shù)示例解讀
文章出自:http://m.5511xx.com/article/cogocdi.html


咨詢(xún)
建站咨詢(xún)
