C 的虛函式

2022-03-11 21:06:44 字數 1051 閱讀 5991

1 多型產生的背景

希望同乙個方法在派生類和基類中的行為是不同的,換句話來說,方法的行為取決於呼叫該方法的物件。

2 解決多型的兩種方法

1)在派生類中重新定義基類的方法

2)使用虛方法

3 虛函式的定義

擁有 virtual 關鍵字的函式稱之為虛函式

virtual void click(int id, int row, int col);
經常在基類中將派生類會重新定義的方法宣告為虛方法,方法在基類中被宣告為虛的後,它在派生類中將自動成為虛方法。然而,在派生類宣告中使用關鍵字virtual 來指出那些函式是虛函式也不失為乙個好方法。

4 為何需要虛析構函式

《c++ primer plus(第六版)》p501

5 有哪些函式可以成為虛函式?那些函式不可以成為虛函式?

要成為虛函式必須滿足兩點,一就是這個函式依賴於物件呼叫,因為虛函式就是依賴於物件呼叫,因為虛函式是存在於虛函式表中,有乙個虛函式指標指向這個虛表,所以要呼叫虛函式,必須通過虛函式指標,而虛函式指標是存在於物件中的。二就是這個函式必須可以取位址,因為我們的虛函式表中存放的是虛函式函式入口位址,如果函式不能定址,就不能成為虛函式。

所以呢,這些函式不能成為虛函式;

1.內聯函式:我們都知道內聯函式只是在函式呼叫點將其展開,它不能產生函式符號,所以不能往虛表中存放,自然就不能成為虛函式。

2.靜態函式:定義為靜態函式的函式,這個函式只和類有關係,它不完全依賴於物件呼叫,所以也不能成為虛函式。

3.建構函式:都知道只有當呼叫了建構函式,這個物件才能產生,如果把建構函式寫成虛函式,這時候我們的物件就沒有辦法生    成。更別說用物件去呼叫了。所以建構函式不能成為虛函式。

那些函式可以成為虛函式呢?

普通的成員方法是可以成為虛函式的

還有析構函式,因為析構函式是為了釋放物件的,所以之前我們的物件已經生成,而且析構函式可以取位址,所以可以成為虛函式。

參考資料

C 虛函式 純虛函式

1 基本概念 虛函式是在基類中使用關鍵字virtual宣告的函式。在派生類中重新定義基類中定義的虛函式時,會告訴編譯器不要靜態鏈結到該函式。我們想要的是在程式中任意點可以根據所呼叫的物件型別來選擇呼叫的函式,這種操作被稱為動態鏈結,或後期繫結。您可能想要在基類中定義虛函式,以便在派生類中重新定義該函...

C 虛函式 純虛函式

1.析構函式是否應為虛函式問題?2.成員函式的虛函式問題?3.析構函式是否可以為純虛函式問題?說明 僅在使用父類指標指向子類物件時有區別 當析構函式非虛函式時,使用父類指標指向子類物件,在析構時將不會呼叫子類析構函式 當析構函式是虛函式時,使用分類指標指向子類物件,在析構時會呼叫子類析構函式,且呼叫...

C 虛函式 純虛函式

include qdebug class animal void animal animal 即要實現基類animal的animal函式 假如在dog子類中沒有實現animal 函式,則會呼叫基類的animal 函式。即列印 what is the animal 假如在dog子類中實現了animal...