C 學習(虛函式)

2021-07-07 08:37:22 字數 1061 閱讀 8176

1>靜態聯編,動態聯編

將源**中的函式呼叫解釋為執行特定的函式**塊被稱為函式名聯編

在c語言中,沒有函式的過載,所以,在編譯過程中就可以完成函式的聯編,這種叫靜態聯編。

而c++中,虛函式的使用,使得在編譯過程中我們無法得知使用的是哪乙個,所以編譯器 只能在程式執行時選擇正確的虛函式**,這種叫動態聯編。

2> 虛函式的工作原理

編譯器處理虛函式的方法: 給每個物件新增乙個隱式的成員,成員中儲存了乙個指向函式位址陣列的指標,這種陣列稱為,虛函式表,虛函式表儲存的是為類物件進行宣告的虛函式位址。

3>注意 :

1)如果要用指向物件的引用或指標來呼叫虛方法,程式將使用為物件型別定義的方法。

就比如:

#include 

#include

#include

#include

using

namespace

std;

class a

這樣的話輸出的是b;

2) 建構函式不能是虛函式,建立派生類物件是,將呼叫派生類的建構函式,而不是基類的建構函式,然後,派生類的建構函式將使用基類的建構函式。

3) 析構函式,如果類要是基類的話應當是虛函式。

駕駛額empoyee是基類,singer是派生類,並新增乙個char *成員,該成員是指向有new分配的記憶體。當singer過期的時候,移動會呼叫~singer()析構函式來釋放記憶體:

那麼

employee *pe = new

string;

。。。delete pe;

這時候呼叫的是 ~employee()析構函式,釋放由singer物件中employee部分指向的記憶體,但不會釋放新的類成員指向的記憶體。

但是如果析構函式是虛擬的話,則上述**先呼叫 ~singer析構函式;

4> 友元函式不能是虛函式,因為友元函式不是類成員。

5>如果重新定義繼承的方法,應確保與原來的原型完全相同,但如跟返回值型別是基類引用或者指標的時候,則可以修改為指向派生類的引用或指標, 稱為返回型別協變。

c 學習 虛函式

虛函式學習 1.虛函式的關鍵字是virtual.2.如果在父類中成員函式前加上virtual,則如果子類中定義了重名函式,則兩者會產生聯絡.3.virtual函式的子子孫孫都是virtual的,管你在子類中說不說,但好習慣還是加上.4.當向上造型 upcast 用父類指標或引用去訪問子類的虛函式時,...

C 學習 (03)虛函式 虛指標 虛表

對於類的成員函式,如果在前面加上virtual,那麼這個成員函式就是虛函式,這個類就是帶有虛函式的類。帶沒有虛函式的類,與不帶虛函式的類之間有什麼區別呢?帶有虛函式的模擬不帶虛函式的類會多乙個指標,這個指標就是虛指標,而虛指標指向乙個表,這個表就叫做虛表。虛表裡面存的內容就是虛函式的位址。例子 in...

C 學習之 虛函式

靜態聯編 運算子過載 過載函式是通過 名字壓延 方法來實現。即在編譯時將函式名和引數結合起來創造乙個新的函式名,用新的名字替換原有名字。執行時多型性虛函式是在類定義中的函式原型宣告前加乙個關鍵字virtual。在派生類中重新定義時,它的函式原型 包括返回型別,函式名,引數個數和引數型別 必須與基類中...