天天看點

C++進階學習---多肽

C++進階學習---多肽

來源:微信公衆号「程式設計學習基地」 @[toc](目錄) #### 虛函數

普通成員函數前加關鍵字virtual,稱為虛函數

子類成員函數和基類的虛函數具有相同函數原型,該成員函數也就是虛函數,無論其是否帶有virtual關鍵字,都對基類虛函數構成覆寫

函數為成員函數(非靜态)

基類使用virtual

原型嚴格相同

虛函數程式示例:

加關鍵字virtual:

編譯器通過指針或引用調用虛函數,不會立即生成函數調用指令,而是用一段代碼代替确定真實類型,找到虛函數表進而找到入口位址,根據入口位址調用函數。

C++進階學習---多肽

列印結果

監視裡面也可以很好的看到a,b兩個類的對象有一個__vfptr的指針,指向兩個虛函數,

C++進階學習---多肽

子類提供了對基類虛函數的有效覆寫,通過指向子類對象的基類指針,或者引用子類對象的基類引用,調用該虛函數,實際上調用的将是子類中的覆寫版本,而非基類中的原始版本

一般函數調用是通過調用對象類型決定,而多态這是通過調用者指針或引用的實際目标對象的類型決定

多态隻能通過引用或指針表現,且指針更靈活

除構造和析構函數,通過基類中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% 。

繼承關系圖:

C++進階學習---多肽