虛函式與聯編

2021-09-25 09:19:06 字數 1326 閱讀 8058

虛函式必須是基類的非靜態成員函式,其訪問許可權可以是private或protected或public,在基類的類定義中定義虛函式的一般形式。在某基類中宣告為 virtual 並在乙個或多個派生類中被重新定義的成員函式,實現多型性。

語法:

virtual 函式返回型別 函式名(參數列)

虛函式必須是基類的非靜態成員函式,其訪問許可權可以是private或protected或public,在基類的類定義中定義虛函式的一般形式:

class基類名;

虛函式的作用是實現動態聯編,也就是在程式的執行階段動態地選擇合適的成員函式,在定義了虛函式後,可以在基類的派生類中對虛函式重新定義,在派生類中重新定義的函式應與虛函式具有相同的形參個數和形參型別。以實現統一的介面,不同定義過程。如果在派生類中沒有對虛函式重新定義,則它繼承其基類的虛函式。

當程式發現虛函式名前的關鍵字virtual後,會自動將其作為動態聯編處理,即在程式執行時動態地選擇合適的成員函式。虛函式是c++多型的一種表現。

純虛函式:是一種特殊的虛函式,使用virtual關鍵字,並且在其後面加上=0。

當類中存在動態記憶體分配時,經常將類的析構函式宣告為虛函式。

靜態聯編又稱靜態繫結,指在呼叫同名函式(即過載函式)時編譯器將根據呼叫時所使用的實參在編譯時就確定下來應該呼叫的函式實現。它是在程式編譯連線階段進行聯編的,這種聯編又稱為早期聯編,這是因為這種聯編工作是在程式執行之前完成的。

它的優點是速度快,效率高,但靈活性不夠。

如果是通過物件名呼叫虛函式,在編譯階段就能確定呼叫的是哪乙個類的虛函式,所以屬於靜態聯編。

編譯時所進行的聯編又稱為靜態束定。束定是指確定所呼叫的函式與執行該函式**之間的關係。

動態聯編也稱動態繫結,是指在程式執行時,根據當時的情況來確定呼叫的同名函式的實現,實際上就是在執行時選擇虛函式的實現。這種聯編又稱為晚期聯編或動態束定。它的優點是靈活性強,但效率較低。

實現條件:①要有繼承性且要求建立子型別關係;②要有虛函式;③通過基類的物件指標或引用訪問虛函式。

如果是通過基類指標呼叫虛函式,在編譯階段無法從語句本身確定呼叫哪乙個類的虛函式,只有在執行時,指標指向某一類的物件後,才能確定是哪乙個類的虛函式,故為動態聯編。

c++中一般情況下的聯編是靜態聯編,但是當涉及到多型性和虛函式時應該使用動態聯編。

繼承是動態聯編的基礎,虛函式是動態聯編的關鍵,虛函式經過派生之後,在類族中就可以實現執行過程中的多型。動態聯編要求在執行時解決程式中的函式呼叫與執行該函式**間的關係,呼叫虛函式的物件是在執行時確定的。對於同乙個物件的引用,採用不同的聯編方式將會被聯編到不同類的物件上。即不同聯編可以選擇不同的實現,這便是多型性。

虛函式 1 靜態聯編與動態聯編,引入虛函式

在實際開發工作中,為提高 的重用性,編寫通用的功能模組,往往需要設計處理幾種不同物件的通用程式,如示例2.1所示。示例清單2.1 include stdio.h include stdlib.h 定義函式指標型別displayinteger,指向返回值為void,引數列表為 const int 的函...

虛函式及靜態聯編與動態聯編 學習筆記

c primer plus 第13章 類繼承 由於虛函式與靜動態聯編關係緊密,所以放在一處詳細說明,令請見另一篇文章virtual屬性對類繼承的影響 學習筆記,此文章包含了下面1中第二點的詳細描述及乙個示例。1 提到靜態聯編與動態聯編,我們首先需要來講講virtual函式,虛函式的一些要點 在基類方...

靜態聯編(函式過載)和動態聯編(虛函式)

一 靜態聯編 定義 由於函式過載,編譯器必須檢視函式引數以及函式名就能確定使用哪個函式 這種c c 編譯器可以在編譯過程中完成的聯編,被稱為靜態聯編 函式過載 在同一作用域中,可以有一組具有相同函式名,不同引數列表的函式,這組函式被稱為過載函式 二 動態聯編 定義 使用哪個函式是不能在編譯時確定的,...