來源:微信公衆号「程式設計學習基地」 @[toc](目錄) #### 虛函數
普通成員函數前加關鍵字virtual,稱為虛函數
子類成員函數和基類的虛函數具有相同函數原型,該成員函數也就是虛函數,無論其是否帶有virtual關鍵字,都對基類虛函數構成覆寫
函數為成員函數(非靜态)
基類使用virtual
原型嚴格相同
虛函數程式示例:
加關鍵字virtual:
編譯器通過指針或引用調用虛函數,不會立即生成函數調用指令,而是用一段代碼代替确定真實類型,找到虛函數表進而找到入口位址,根據入口位址調用函數。
列印結果
監視裡面也可以很好的看到a,b兩個類的對象有一個__vfptr的指針,指向兩個虛函數,
子類提供了對基類虛函數的有效覆寫,通過指向子類對象的基類指針,或者引用子類對象的基類引用,調用該虛函數,實際上調用的将是子類中的覆寫版本,而非基類中的原始版本
一般函數調用是通過調用對象類型決定,而多态這是通過調用者指針或引用的實際目标對象的類型決定
多态隻能通過引用或指針表現,且指針更靈活
除構造和析構函數,通過基類中this指針可以滿足多态
其實在虛函數裡面就已經講解到多肽了
應用程式不必為每一個派生類編寫功能調用,隻需要對抽象基類進行處理即可。大大提高程式的可複用性
派生類的功能可以被基類的指針或引用變量所調用,這叫向後相容,可以提高可擴充性和可維護性。
隻有虛析構,沒有虛構造
不加virtual 修飾~a(),列印結果
記憶體洩漏了,b類裡面的*p指向的堆記憶體沒有釋放
解決辦法:
析構前面加上關鍵字virtual構成虛析構
注意:
如果父類的析構函數不是虛析構,父類的指針指向子類時,delete掉父類的指針,隻調動父類的析構函數,而不調動子類的析構函數
如果父類的析構函數是虛析構,父類的指針指向子類時,delete掉父類的指針,先調動子類的析構函數,再調動父類的析構函數
形如virtual 傳回值 函數名(形參表)=0;的虛函數,稱為純虛函數或抽象方法
至少擁有一個純虛函數的類成為抽象類
抽象類不能執行個體化為對象
抽象類子類不對基類中全部純虛函數提供有效覆寫,子類也是抽象類
不能執行個體化抽象類
全部由純虛函數構成的抽象類成為純抽象類或接口
某小型公司,主要有四類員工( employee ):經理( manager )、技術人員( technician )、銷售經理( salesmanager )和推銷員( salesman )。
現在 , 需要存儲這些人員的姓名( name )、編号( id )、當月薪水( salary )。計算月薪總額并顯示全部資訊。人員編号基數為 1000 ,每輸入一個人員工資訊編号順序加 1 。
月薪計算辦法是:
經理拿固定月薪 8000 元;
技術人員按每小時 100 元領取月薪;
推銷員的月薪按該推銷員當月銷售額的 4% 提成;
銷售經理既拿固定月薪也領取銷售提成,固定月薪為 5000 元,銷售提成為所管轄部門當月銷售總額的 5% 。
繼承關系圖: