從實用主義深刻理解c++虛函數

記得幾個月前看過C++虛函數的問題,當時其實就看懂了,最近筆試中遇到了虛函數居然不太肯定,因此仍是理解的不深入,因此想經過這篇文章來鞏固下。ios

裝逼一刻:windows

最近,本人思想發生了巨大的轉變,在大學的時候因爲讀書少,常常寫一些玩具程序而沾沾自喜,總之一句話,那時寫程序純粹是爲了寫程序而寫程序。然而,做爲大部分的學習者來講,每每忽略了學習開發語言的本質。即C++語言的設計思想也是以服務生產生活爲主的,總結成一句話就是C++是實用的。咱們在學習這門語言的一些特性的時候,上來就開始直接去記憶或者揣摩這些特性的自己每每不是一個很好的學習方法。ide

當你弄明白了這個特性是爲了解決什麼問題而設計的時候,在現實中有那些應用的時候,再去結合理解這些特性就會很容易理解的更深入,更難忘。函數

同時,寫程序也同樣,做爲一個之前上來就開始寫程序的人深深以爲之前的本身很愚蠢。哪怕你去寫一個很簡單的接口函數,都要去儘可能的想,這個程序的參數多是有那些人經過那些操做來傳遞的,他們可能出現的誤操做是那些?若是出現了誤操做該怎麼去處理?當想清楚了這一切再去寫函數。(想的多的人,每每比上來蠻幹的人,要牛x的多。)學習

-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------spa

so,既然裝了那麼多逼,那麼爲何要設計虛函數這個概念呢!.net

談到這裏,不得不談下多態,有人常常會問什麼是多態?其實,多態簡單的說就是不一樣的對象受到相同的刺激而產生的不一樣反應。最直接明瞭的例子就是在windows平臺下,你雙擊不一樣類型的文件,會調用不一樣的關聯軟件去打開同樣。好比,點擊word類型文件,系統會調用word來打開,點擊一個.mp4文件,快播就默默的蹦出來了。因此,這就是多態,一個相同的動做,遇到不一樣的對象產生不一樣的反應,就是這麼一致和高效。設計

 可能有人會說了我擦,這特麼不太正常了嗎!點擊不一樣的文件,出現不一樣的反應在人類來看這也許就是天經地義的事情,並無什麼呀!但是做爲一門語言想要達到這樣的效果,仍是須要一番深思熟慮的考慮以及巧妙的設計,固然這些人都是頂級的計算機專家了。他們爲了解決這些咱們人類邏輯看來天經地義的事情而設計了虛函數。指針

從某種程度上來說,虛函數是爲實現多態而存在的。code

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

show code:

接下來就到了咱們最喜歡的show code環節:爲了方便理解,仍然舉雙擊文件的例子。

咱們假設這裏有三個類,分別是 基類 - CFile    派生類 - CMovie  派生類 - CMusic  。三個派生類分別表明,電影文件 音樂文件 。

假如這些文件都有一個接受雙擊後的函數反應,定義爲Clicked。

所以有了下面簡單的代碼:

 1 /**********************************************************************
 2 programe: butter know virtual function
 3 auther:   heat nan
 4 data:     2015.8.19
 5 mail:     964465194@qq.com
 6 ************************************************************************/
 7 
 8 #include<iostream>
 9 using namespace std;
10 class CFile
11 {
12     public:
13         CFile()
14         {
15         }
16         virtual void Clicked()
17         {
18             cout<<"I am doing nothing!"<<endl;
19         }
20 };
21 class CMovie:public CFile
22 {
23     public:
24         CMovie()
25         {
26             cout<<"My name is wujiandao!"<<endl;
27         }
28         void Clicked()
29         {
30             cout<<"Video type,KuaiBo will running!"<<endl;
31         }
32 };
33 class CMusic:public CFile
34 {
35     public:
36         CMusic()
37         {
38             cout<<"My name is the fox!"<<endl;
39         }
40         void Clicked()
41         {
42             cout<<"Music type,Kugou will running!"<<endl;
43         }
44 };
45 int main()
46 {
47     CFile A;
48     CMovie W;
49     CMusic F;
50 
51     CFile *ptr=&A;
52 
53     ptr=&W;
54     ptr->Clicked();
55 
56     ptr=&F;
57     ptr->Clicked();
58     return 0;
59 }

有了上面,如此簡單粗暴的例子,以及一個很直觀的多態例子,相信對爲何要虛函數,以及引入虛函數作什麼就很清楚了。

其實上面這個簡單的例子我以爲就能夠這樣理解,ptr這個指針呢,就能夠理解爲雙擊操做,固然實時狀況並非這樣,這裏只是簡化理解,當這個指針操做不一樣類型的文件時產生不一樣的反應。那麼,不用Clicked函數不聲明爲虛函數能夠嗎?答案是否認的。不信能夠試試。

必定要明白一件事情:虛函數不是爲何有這樣的功能,而是人們爲了實現某種特定的功能而去設計的虛函數的一些特性和功能。

————————————————————————————————————————————————————————————————————————————

PS:虛函數的一些細節問題:

1 注意到繼承類中的Clicled()函數中並無添加關鍵字virtual,這是由於虛函數是一種強繼承類型的函數,只要在繼承類中函數名以及參數的形式和基類的相同,那它就會被認爲是一個虛函數。所以,基類中的virtual關鍵字是不能省的。

2 虛函數完成多態的展示,須要指針的配合。(引用也能夠,這個設計到虛函數的實現,本文直說理解,暫不討論)

3 不能將構造函數定義爲虛函數。(具體查看http://blog.csdn.net/jiadebin890724/article/details/7951520

4 虛函數必須是類的成員函數,但不能是靜態成員函數。(具體討論 http://bbs.csdn.net/topics/360075548

暫且先這樣吧! 

相關文章
相關標籤/搜索