一、靜態聯編
定義:由於函式過載,編譯器必須檢視函式引數以及函式名就能確定使用哪個函式;這種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
靜態聯編和動態聯編
聯編是指乙個電腦程式自身彼此關聯 使乙個 源程式經過編譯 連線,成為乙個可執行程式 的過程,在這個聯編過程中,需要確定程式中的操作呼叫 函式呼叫 與執行該操作 函式 的 段之間的對映關係,按照聯編所進行的階段不同,可分為靜態聯編和動態聯編。靜態聯編 呼叫函式和被調函式在程式編譯時,他們在記憶體中的位...
靜態聯編和動態聯編
聯編就是將模組或者函式合併在一起生成可執行 的處理過程,同時對每個模組或者函式呼叫分配記憶體位址,並且對外部訪問也分配正確的記憶體位址,它是電腦程式彼此關聯的過程。按照聯編所進行的階段不同,可分為兩種不同的聯編方法 靜態聯編和動態聯編。靜態聯編是指在編譯階段就將函式實現和函式呼叫關聯起來,因此靜態聯...
靜態聯編和動態聯編
聯編就是將模組或者函式合併在一起生成可執行 的處理過程,同時對每個模組或者函式呼叫分配記憶體位址,並且對外部訪問也分配正確的記憶體位址,它是電腦程式彼此關聯的過程。按照聯編所進行的階段不同,可分為兩種不同的聯編方法 靜態聯編和動態聯編。靜態聯編是指在編譯階段就將函式實現和函式呼叫關聯起來,因此靜態聯...