1、成員函式的實現機制和普通(全域性)函式沒有本質區別,對編譯器而言,經過名稱處理以後(在函式名前加上命名空間、類名),乙個成員函式就是普通函式了,在編譯後的**區域有確定的函式體和入口位址。最大的差別在於發生呼叫時,對於成員函式,編譯器會隱含語句push this,其中this指標指向物件的位址,這就是操作所需要的資料的所在。編譯後的成員函式呼叫可能是:
...push this
call f
...因此,在對類使用sizeof時,是無法看到成員函式占用空間的,因為其入口位址僅僅是在函式呼叫時由編譯器確定,而類儲存空間中無需記錄任何有關成員函式的資訊。
2、而靜態成員函式實際上就是普通函式,只不過編譯器限制了它的名字可視範圍而已(因為在編譯時在函式名前加上了類名)。因此呼叫靜態成員函式時不需要push this指標的,只需要在函式名字前加上類名限定符就可以了。
3、根據以上內容可以更好理解虛函式動態繫結。當乙個類中定義了虛函式,編譯器會為該類定義乙個虛表,該虛表記錄著所有虛函式的入口位址。與此同時,類的資料成員中會被插入乙個虛指標指向這個虛表(設定v-ptr必須發生在對基類建構函式的呼叫之後。因為,繼承類如果有自己的虛函式表,那麼v-ptr會被改寫,以指向該錶,即使此前v-ptr已經被基類所設定)。這就是為何定義成員函式不會改變sizeof(class)的大小,而定義乙個或多個虛函式均會使sizeof(class)的大小增加4(虛指標的儲存空間)。而在呼叫虛函式時,使用跟呼叫成員函式相同的策略,先push this,再根據this指向物件取得虛表中相應虛函式的入口位址,通過這樣實現動態繫結,而不會像成員函式一樣在編譯時確定其入口位址。
成員函式呼叫虛函式
在乙個基類或派生類的成員函式中可以直接呼叫該類等級中的虛函式,例如 class a void act2 virtual void act3 virtual void act4 void act5 void act4 void act5 在上例情況下,this指向b,所以a act2 呼叫b act3...
虛指標,虛函式,虛函式表,純虛函式
虛指標 虛繼承 在使用多重繼承時,如存在 class a 有m a變數 class a1 virtual public a,m a1 class a2 virtual public a m a2 class b public a1,public a2 m b 時 存在以下記憶體儲存順序 虛指標 指向...
this指標 虛函式
include using namespace std class a virtual void vhello 上面 會輸出 hello 然後就不會再有輸出。1 為什麼p是空指標,還有輸出 在上面的程式中,p 明明是乙個空指標,為何通過它還能正確呼叫 a 的成員函式 hello 呢?p hello ...