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

2021-10-21 03:09:31 字數 2353 閱讀 1813

一、靜態聯編

定義:由於函式過載,編譯器必須檢視函式引數以及函式名就能確定使用哪個函式;這種c/c++編譯器可以在編譯過程中完成的聯編,被稱為靜態聯編

函式過載:在同一作用域中,可以有一組具有相同函式名,不同引數列表的函式,這組函式被稱為過載函式

二、動態聯編

定義:使用哪個函式是不能在編譯時確定的,因為編譯器不知道使用者將要選擇哪種型別的物件。所以,編譯器必須生成能夠在程式執行時選擇正確的虛方法的**,這就是動態聯編。

1、虛函式

定義:定義非常簡單,只需要在成員函式原型前加乙個關鍵字virtual即可

特點:如果乙個基類的成員函式定義為虛函式,那麼它在派生類中也保持為虛函式;即使在派生類中省略了virtual關鍵字,也仍然是虛函式。

重定義的格式要求:

①與基類的虛函式有相同的引數個數

②與基類的虛函式有相同的引數型別

③與基類的虛函式有相同的返回型別

2、虛函式的訪問

(1)物件名呼叫虛函式:和普通函式一樣,虛函式一樣可以通過物件名來呼叫,此時編譯器採用的是靜態聯編。

通過物件名訪問虛函式時,呼叫哪個類的函式取決於定義物件名的型別。

物件型別是基類時,就呼叫基類的函式;物件型別是子類時,就呼叫子類的函式

(2)指標訪問:

①:使用指標訪問非虛函式時,編譯器根據指標本身的型別決定要呼叫哪個函式,而不是根據指標指向的物件型別

②:使用指標訪問虛函式時,編譯器根據指標所指物件的型別決定要呼叫哪個函式(動態聯編),而與指標本身的型別無關

(3)引用訪問:與指標類似;不同的是,引用一經宣告後,引用變數本身無論如何改變,其呼叫的函式就不會再改變,始終指向其開始定義時的函式。

3、觸發動態繫結的條件

(1)只有指定為虛函式的成員函式才能進行動態繫結,成員函式預設為非虛函式,非虛函式不進行動態繫結

(2)必須通過基類型別的引用或者指標進行函式呼叫

4、虛函式的工作原理

編譯器處理虛函式的方法是:給每個物件新增乙個隱藏成員。隱藏成員中儲存了乙個指向函式位址陣列的指標。

這種陣列稱為虛函式表。虛函式表中儲存了為類物件進行宣告的虛函式的位址。

無論類中包含的虛函式是1個還是10個,都只需要在物件中新增1個位址成員(表的位址),只是表的大小不同而已

虛函式機制:

5、有關虛函式的注意事項

(1)建構函式:建構函式不能是虛函式

根據繼承的性質,建構函式執行的順序是:基類的建構函式->派生類的建構函式

但是如果基類的建構函式是虛函式,且派生類中也出了建構函式,

那麼當下應該會只執行派生類的建構函式,不執行基類的建構函式,那麼基類的建構函式就不能構造了

(2)析構函式:析構函式應當是虛函式,除非類不用做基函式。比如:假設employee是基類,singer是派生類,並新增乙個char *成員,該成員指向由new分配的記憶體,然後,呼叫~singer()析構函式來釋放記憶體。

**如下:

employee * pe =

new singer;

//true employee是singer的基類

delete pe;

//~employee()or ~singer()?

如果使用預設的靜態聯編,delete語句將會呼叫~employee()析構函式。

這將釋放singer物件中的employee部分指向的記憶體,但不會釋放新的成員指向的記憶體。

但是如果析構函式是虛的,則上述**將先呼叫singer析構函式釋放由singer元件指向的記憶體,然後,呼叫employee()析構函式來釋放由employee元件指向的記憶體。

最後,給類的析構函式定義析構函式沒有錯,即使這個類不做基類

(3)友員函式:友元函式不能是虛函式,因為友元不是類成員,而只有成員才能是虛函式

乙個簡單例子:

#include

using

namespace std;

class

base

void

disp2()

};class

child1

:public base

void

disp2()

};void

main()

輸出:hello,child1

hello,base2

靜態聯編和動態聯編

聯編是指乙個電腦程式自身彼此關聯 使乙個 源程式經過編譯 連線,成為乙個可執行程式 的過程,在這個聯編過程中,需要確定程式中的操作呼叫 函式呼叫 與執行該操作 函式 的 段之間的對映關係,按照聯編所進行的階段不同,可分為靜態聯編和動態聯編。靜態聯編 呼叫函式和被調函式在程式編譯時,他們在記憶體中的位...

靜態聯編和動態聯編

聯編就是將模組或者函式合併在一起生成可執行 的處理過程,同時對每個模組或者函式呼叫分配記憶體位址,並且對外部訪問也分配正確的記憶體位址,它是電腦程式彼此關聯的過程。按照聯編所進行的階段不同,可分為兩種不同的聯編方法 靜態聯編和動態聯編。靜態聯編是指在編譯階段就將函式實現和函式呼叫關聯起來,因此靜態聯...

靜態聯編和動態聯編

聯編就是將模組或者函式合併在一起生成可執行 的處理過程,同時對每個模組或者函式呼叫分配記憶體位址,並且對外部訪問也分配正確的記憶體位址,它是電腦程式彼此關聯的過程。按照聯編所進行的階段不同,可分為兩種不同的聯編方法 靜態聯編和動態聯編。靜態聯編是指在編譯階段就將函式實現和函式呼叫關聯起來,因此靜態聯...