c++虛函數的作用是什么?


    《深入淺出MFC》中形容虛函數是執行一般化操作,一直沒有領悟要點。現在的體悟是抽象,先前考慮問題都是由抽象到具象,比如下文中的示例,由上(虛基類的「怪物」)至下(派生類的三個子類「狼」「蜘蛛」「蟒蛇」)考慮。其實逆向思考一下,由具象到抽象,虛函數的作用就顯而易見了,將不同的但同時也是類似的種類的行為提取成為抽象的虛基類中的虛函數,然后執行一般化操作。

c++虛函數的作用是什么?

7sDream二次元新居民/軟件愛好者/零回答消滅者

可能給例子比較好理解的說~~
這樣運行會輸出“A”。
----------------------------------------------------------------------------------
這樣會輸出“B”。
--------------------------------------------------------------------------
補充:上面兩個因為是圖我就不改了~  @vczh 輪子哥教導我們A的析構函數也要加virtual,否則delete p的時候調的是A的析構函數可能會有問題~~
--------------------------------------------------------------------------
簡單說就是
當基類指針指向一個子類對象,通過這個指針調用子類和基類同名成員函數的時候,基類聲明為虛函數「子類不寫也可以」就會調子類的這個函數,不聲明就會調用基類的。自己體會一下0.0
--------------------------------------------------------------------------
需要用的情形的話大概是這樣:
比如你有個游戲,游戲里有個虛基類叫「怪物」,有純虛函數 「攻擊」。然后派生出了三個子類「狼」「蜘蛛」「蟒蛇」,都實現了自己不同的「攻擊」函數,比如狼是咬人,蜘蛛是吐絲,蟒蛇把你纏起來~~
然后出現好多怪物的時候就可以定義一個 虛基類指針數組,把各種怪物的指針給它,然后迭代循環的時候直接 monster[i]->attack() 攻擊玩家就行了,大概見下圖:
如果沒有虛函數的話,管理一堆差不多但是類型又不一樣的對象的時候就比較麻煩了。
---------------------------------------------------------------
大一水平求指導~~不知道說的對不對~~還有代碼格式,變量命名神馬的都求指導~0.0~  @vczh

 
其他的都挺好,除了A的析構函數不是virtual……這樣你delete p是不會執行B的析構函數的
2014-05-31   
7sDream (作者) 回復 vczh
OwO,知道了~~學的時候講到過這個問題~T^T現在又忘了………我繼續學習去好了~
對了還有個問題~~今天聽說MFC框架設計的不太好……那我還要不要學捏?如果不學的話要學什么來代替捏0.0~?
2014-05-31   
vczh  回復 7sDream(作者)
做GUI當然收先學C#用WPF,等你習慣了之后,以后需要用什么框架再切換不是問題。MFC太老了,新項目都不會用了。
2014-05-31   
7sDream (作者) 回復 vczh
3Q~~好嘞~~小學期自學去~一個月的沒課但是又必須呆在學校的時間,應該是不會無聊了~\^0^/
2014-05-31   
基類的指針指向派生類的對象,那么通過指針只能調用基類所定義的成員函數,而如果派生類定義的是虛函數,這個指向派生類的基類指針調用的是派生類的成員函數。
2014-06-03   
就是這么個理兒!

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
粤ICP备14056181号  © 2014-2021 ITdaan.com