如何利用乙個迴圈結構,依次處理同乙個類族中不同類的物件?
如何解決這個問題呢?這就要應用到虛函式來實現多型性。
虛函式是動態繫結的基礎,必須是非靜態的成員函式。虛函式經過派生之後,在類族中就可以實現執行過程中的多型。
根據賦值相容規則,可以使用派生類物件來代替基類物件。如果用基類型別的指標指向派生類物件,就可以通過這個指標訪問該物件,但訪問到的,僅僅是從基類整合來的同名成員。
解決這一問題的辦法:如果需要通過基類的指標指向派生類的物件,並訪問某個與基類同名的成員,那麼首先在基類中將這個同名函式宣告為虛函式。
這樣,通過基類型別的指標,就可以使屬於不同派生類的不同物件產生不同的行為(操作),從而實現執行過程中的多型。
一般虛函式成員
宣告語法:virtual 函式型別 函式名(形參表)
其實就是在類的定義中使用virtual關鍵字來限定成員函式,虛函式只能出現在類定義中的函式原型宣告中,而不能在成員函式實現的時候。
執行過程中的多型需要滿足三個條件:
1、滿足賦值相容規則。
2、宣告虛函式。
3、由成員函式來呼叫或者是通過指標、引用來訪問虛函式。
如果使用物件名來訪問虛函式,則繫結在編譯過程中就可以進行(靜態繫結),無需在執行過程中進行。
注意:虛函式一般不能宣告為內聯函式,因為虛函式的呼叫時需要動態繫結的,而對內聯函式的處理是靜態的,所以虛函式一般不宣告為內聯函式(語法上是沒有問題的)。
例項:
#include #include using namespace std;
class base //基類
; void base::display()const
int main()
執行結果:
結果分析:
程式中的base1和base2、base屬於同乙個類族,而且是通過共有派生而來的,因此滿足賦值相容規則。
同時,基類base的成員函式display()宣告為虛函式,程式中使用物件指標來訪問函式成員。
這樣繫結過程就是在執行中完成的,實現了執行中的多型。
通過基類型別的指標留可以訪問正在指向的物件的成員,這樣就能夠對同一類族中的物件進行同一的處理,抽象程度更高,程式更加簡潔、高效。
系統如何判斷派生類的乙個函式成員是不是虛函式呢?主要有以下方法:
1、該函式是否與基類的虛函式由相同的名稱。
2、該函式是否與基類的虛函式有相同的引數個數和相同的對應引數型別。
3、該函式是否與基類的虛函式有相同的返回值或者滿足賦值相容規則的指標、引用型的返回值。
如果從名稱、引數、返回值這三個方面檢查之後,派生類滿足上述條件,就會自動確定為虛函式。這時,派生類的虛函式便會自動覆蓋基類的虛函式。
同時,派生類的虛函式還會隱藏基類中同名函式的所用其他過載形式。
注意:基類中宣告的非虛函式,通常是代表那些不希望被派生類改變的功能,也是不能實現多型的。所以一般不要重寫繼承來的非虛函式(語法上是沒有限制的),
因為這樣就會導致通過基類指標和派生類的指標或者物件呼叫同名函式時,產生不同的結果,引起混亂。
虛析構函式
在c++中,不能宣告虛建構函式,在可以宣告虛析構函式。
宣告方法:virtual ~類名();
當析構函式設定為虛函式之後,在使用指標引用時可以動態繫結,實現執行時多型。
保證使用基類型別的指標就能夠呼叫適當的析構函式針對不同的物件進行清理工作。
一句話:如果有可能通過基類指標呼叫物件的析構函式,就需要讓基類的析構函式稱為虛函式,不然會產生不確定的後果。
例項:下面通過乙個例項來說明。
#include #include using namespace std;
class base //基類
; base::~base()
;
執行結果:
從結果可以看出,此時物件所占用的記憶體才徹底的清楚乾淨了。派生類中動態申請的記憶體被正確的釋放了。
C 虛函式,純虛函式,虛析構和純虛析構
c 虛函式 定義為虛函式是為了允許用基類的指標來呼叫子類的這個函式,是需要具體實現的 virtual void funtion1 c 純虛函式 一 定義 純虛函式是在基類中宣告的虛函式,它在基類中沒有定義,但要求任何派生類都要定義自己的實現方法。在基類中實現純虛函式的方法是在函式原型後加 0 vir...
C 虛析構函式和純虛析構函式
我們知道析構函式是在物件生命週期結束時自動被呼叫,用來做一些清理工作 如釋放控制代碼,釋放堆記憶體等 防止出現記憶體洩漏。那怎麼還有虛析構函式呢?使用虛析構函式的類一般是要作為基類,被其他類繼承。通過把基類的析構函式宣告為虛函式,就可以通過父類指標來釋放子類物件,從而完成子類的一些清理工作,防止出現...
c 的虛析構函式和純虛析構函式
虛函式是用作實現子類的多型性的,它可以在執行的過程中選擇子類或者父類的同名函式,意思就是說,每次只有乙個函式執行。但是對於析構函式來說,子類 與父類在銷毀物件時,都應該要呼叫 所以把父類的析構函式定義為虛函式,會發生什麼事情呢。class class b public a int main 可以發現...