国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

淺析C++中的虛函數

2020-01-26 15:55:51
字體:
來源:轉載
供稿:網友

一、定義
定義:在某基類中聲明為 virtual 并在一個或多個派生類中被重新定義的成員函數。

語法:virtual 函數返回類型函數名(參數表) { 函數體 }   

用途:實現多態性,通過指向派生類的基類指針,訪問派生類中同名覆蓋成員函數  虛函數必須是基類的非靜態成員函數,其訪問權限可以是protected或public。

定義為virtual的函數是基類期待派生類重新定義的,基類希望派生類繼承的函數不能定義為虛函數。

二、作用
虛函數的作用是實現動態聯編,也就是在程序的運行階段動態地選擇合適的成員函數,在定義了虛函數后,可以在基類的派生類中對虛函數重新定義,在派生類中重新定義的函數應與虛函數具有相同的形參個數和形參類型。以實現統一的接口,不同定義過程。如果在派生類中沒有對虛函數重新定義,則它繼承其基類的虛函數。  當程序發現虛函數名前的關鍵字virtual后,會自動將其作為動態聯編處理,即在程序運行時動態地選擇合適的成員函數。虛函數是C++多態的一種表現。

使用虛函數,我們可以靈活的進行動態綁定,當然是以一定的開銷為代價。如果父類的函數(方法)根本沒有必要或者無法實現,完全要依賴子類去實現的話,可以把此函數(方法)設為virtual 函數名=0 我們把這樣的函數(方法)稱為純虛函數如果一個類包含了純虛函數,稱此類為抽象類。

我們只需在把基類的成員函數設為virtual,其派生類的相應的函數也會自動變為虛函數。

三、動態綁定過程
表面點來說,虛函數是根據調用它的指針或引用所指向或綁定的對象的類型來調用綁定或指向的類型所定義的虛函數版本。

由于類中有虛函數存在,所以編譯器就會為這個類插入一段你不知道的數據,并為它創建一個表。那段數據叫做vptr指針,指向那個表。那個表叫做vtbl,每個類都有自己的vtbl,vtbl的作用就是保存自定義為virtual的函數是基類期待派生類重新定義的,基類希望派生類繼承的函數不能定義為虛函數己類中虛函數的地址,我們可以把vtbl形象地看成一個數組,這個數組的每個元素存放的就是虛函數的地址。

調用虛函數時,首先是取出vptr的值,這個值就是vtbl的地址,再根據這個值來到vtbl這里,取出vtbl中相應的slot里的值,這個值就是所在調用的虛函數的地址了,最后調用這個函數。現在我們可以看出來了,只要vptr不同,指向的vtbl就不同,而不同的vtbl里裝著對應類的虛函數地址,所以這樣虛函數就可以完成它的任務。

四、純虛函數
在基類中不能對虛函數給出有意義的實現,而把它聲明為純虛函數,它的實現留給該基類的派生類去做。這就是純虛函數的作用。

純虛函數可以讓類先具有一個操作名稱,而沒有操作內容,讓派生類在繼承時再去具體地給出定義。凡是含有純虛函數的類叫做抽象類。這種類不能聲明對象,只是作為基類為派生類服務。除非在派生類中完全實現基類中所有的的純虛函數,否則,派生類也變成了抽象類,不能實例化對象。在函數形參后面寫上=0以指定純虛函數。

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 上饶市| 喀喇| 鸡泽县| 萝北县| 桑植县| 宁波市| 溆浦县| 岳池县| 渭南市| 咸宁市| 遂平县| 龙游县| 大悟县| 新绛县| 浑源县| 隆子县| 龙岩市| 珲春市| 手游| 怀远县| 鹤壁市| 深泽县| 徐闻县| 乌鲁木齐县| 湖州市| 来宾市| 巧家县| 秦安县| 宝鸡市| 新营市| 同心县| 兴文县| 谷城县| 泰兴市| 巍山| 长治县| 青冈县| 象州县| 岳阳县| 衡阳市| 习水县|