首先要說明,我不是乙個理論派,很少努力的閱讀課外書籍,只是用到的時候才去找。因此理論上有缺失,導致對本文出現的「陷阱」認識不足。當然,對於一些專業知識比較強的朋友來說,這不是「陷阱」,只是對我當前的知識水平而言。
先舉個例子吧,更好說明情況。假設有兩個類,有兩個虛函式。
#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...