C 虛函式實現機制

2021-06-29 07:05:30 字數 911 閱讀 4755



看完之後,對c++中的虛函式實現機制算的上是恍然大悟,但是個人感覺博文中有幾點不足之處,現在一一枚舉,以下語言僅僅代表個人看法:

1.定位虛表的方式:  

大家都知道含有虛函式的類的例項裡面前4個位元組是虛函式指標占用的記憶體,裡面填充的是虛函式表的位址號。原博文中通過乙個long型別的物件取得前四個位元組的內容,再進行一系列強制轉換。個人覺得可以用如下方式改進:

test object;     //test類中含有虛函式

int *vptr;         //定義int型別的指標指向虛表

memcpy(&vptr,&object,4); //vptr的位址裡面保持續表的位址號

原博文中的強制轉換且不說安全性問題,就我而言,我完全沒有看懂。個人覺得按照如下方式改進,理解起來或許更加容易:

void (test::*vfptr)();                 //定義類的成員函式指標

memcpy(&vfptr,vptr,4);         //將vptr指向的記憶體(就是虛表占用的記憶體)裡面的前4個位元組(就是第乙個虛函式的位址)拷貝到vfptr占用的記憶體裡面

3.呼叫虛函式的方式

原博文中通過傳遞乙個類的指標來呼叫虛函式,但是我仔細試過,這樣根本不能在虛函式裡面呼叫該指標所指向物件的成員變數,究其原因大概是沒能將該指標賦值給this指標吧(我試過用這種方式,在虛函式裡面輸出this指標的值),後面查閱了一些資料,想到了用類的成員函式指標,畢竟成員函式指標要通過類的物件來引用。這樣一來就可以在虛函式中訪問該物件的成員變數了。後面發現果然可以。

(object.*vfptr)(); //呼叫object物件裡面的第乙個虛函式

4.隨便要提一下類的靜態函式可以通過普通的函式指標呼叫,類的非靜態成員函式必須通過類的成員函式指標呼叫。子類的虛函式要麼覆蓋基類的虛函式,要麼排在基類的虛函式後面。

c 虛函式實現機制

1 c 實現多型的方法 其實很多人都知道,虛函式在c 中的實現機制就是用虛表和虛指標,但是具體是怎樣的呢?從more effecive c 其中一篇文章裡面可以知道 是每個類用了乙個虛表,每個類的物件用了乙個虛指標。具體的用法如下 class a class b public a a,b的實現省略 ...

C 虛函式實現機制

c 中的虛函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父型別別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。對c 了解的人都應該知道虛函式 virtual function 是通過一張虛函式表 virtual table 來實現的。簡稱為v table。在這個表中,...

C 虛函式實現機制

本文 至 其實很多人都知道,虛函式在c 中的實現機制就是用虛表和虛指標,但是具體是怎樣的呢?從more effecive c 其中一篇文章裡面可以知道 是每個類用了乙個虛表,每個類的物件用了乙個虛指標。具體的用法如下 class a class b public a a,b的實現省略 因為a有vir...