虛函式的「陷阱」

2021-06-13 22:56:24 字數 1235 閱讀 1114

首先要說明,我不是乙個理論派,很少努力的閱讀課外書籍,只是用到的時候才去找。因此理論上有缺失,導致對本文出現的「陷阱」認識不足。當然,對於一些專業知識比較強的朋友來說,這不是「陷阱」,只是對我當前的知識水平而言。

先舉個例子吧,更好說明情況。假設有兩個類,有兩個虛函式。

#if !defined father

#define fatherclass cfather

;#endif

/#include "stdafx.h"

#include "father.h"

cfather::cfather()

cfather::~cfather()

void cfather::test()

void cfather::hello()

/#if !defined son

#define son

#include "father.h"

class cson : public cfather

;#endif

/#include "stdafx.h"

#include "son.h"

cson::cson()

cson::~cson()

void cson::test()

void cson::hello()

/#include "stdafx.h"

#include "son.h"

int main(int argc, char* argv)

各位看官,請大家想想,son.test()會輸出什麼結果呢?

實際的結果是:

我是老子

兒子在hello

也就是說,

void cfather::test()

中的hello()不是呼叫的cfather的hello,而是cson的hello函式。

以前寫了那麼多**,還從來沒有寫過在乙個虛函式中呼叫本類的另乙個虛函式......,所以,對這種機制還一直不清楚。

更讓人誤會的是,在debug狀態下,在cfather::test函式的hello()行設定斷點,使用偵錯程式檢視, 其呼叫的函式是cfather類的函式,而不是cson類的函式。

經過這個事件,可以發現虛函式也不是亂定義的。有些朋友可能喜歡將函式定義成虛函式,而不考慮是否符合虛函式的機制要求,因此容易產生一些自己不可理解的現象,產生很多的困惑。

對於此類問題,有什麼不同看法,還請指正。

虛指標,虛函式,虛函式表,純虛函式

虛指標 虛繼承 在使用多重繼承時,如存在 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 時 存在以下記憶體儲存順序 虛指標 指向...

C STL VC fread函式的陷阱

如果想實現從某個檔案中一次次n個位元組般讀出來,那建議不要用 read fread buff,n,1,data file 因為就算當檔案的位元組數比n大,但這時strlen buff 絕不是n個位元組大小!也不是read個位元組大小!查幫助文件,可知,read是指成功讀入的單元塊數,這裡對應的就是,...

c c memset函式的陷阱

在c語言程式設計中,memset函式的定義是void cdecl memset out writes bytes all size void dst,in int val,in size t size 即把 dst當前位置後面的 size個位元組全部設定為 val的ascii值,並返回 指標 dst...