生活随笔
收集整理的這篇文章主要介紹了
虚函数的“陷阱”
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
首先要說明,我不是一個理論派,很少努力的閱讀課外書籍,只是用到的時候才去找。因此理論上有缺失,導致對本文出現的“陷阱”認識不足。當然,對于一些專業知識比較強的朋友來說,這不是“陷阱”,只是對我當前的知識水平而言。
??? 先舉個例子吧,更好說明情況。假設有兩個類,有兩個虛函數。
[cpp]?view plaincopy
#if?!defined?FATHER?? #define?FATHERclass?CFather???? {?? public:?? ?CFather();?? ?virtual?~CFather();?? ?virtual?void?Test();?? ?virtual?void?Hello();?? };?? #endif?? ?? #include?"stdafx.h"?? #include?"Father.h"?? CFather::CFather()?? {?? }?? ?? CFather::~CFather()?? {?? }?? ?? void?CFather::Test()?? {?? ????printf("我是老子\r\n");?? ????Hello();?? }?? ?? void?CFather::Hello()?? {?? ????printf("老子在HIGH\r\n");?? }?? ?? #if?!defined?SON?? #define?SON?? ?? #include?"Father.h"?? class?CSon?:?public?CFather???? {?? public:?? ?CSon();?? ?virtual?~CSon();?? ?virtual?void?Test();?? ?virtual?void?Hello();?? };?? #endif?? ?? #include?"stdafx.h"?? #include?"Son.h"?? CSon::CSon()?? {?? }?? ?? CSon::~CSon()?? {?? }?? ?? void?CSon::Test()?? {?? ????CFather::Test();?? }?? ?? void?CSon::Hello()?? {?? ????printf("兒子在HIGH\r\n");?? }?? ?? #include?"stdafx.h"?? #include?"son.h"?? int?main(int?argc,?char*?argv[])?? {?? ????CSon?son;?? ????son.Test();?? ????return?0;?? }???
?
各位看官,請大家想想,son.Test()會輸出什么結果呢?
?實際的結果是:
我是老子
兒子在HELLO
?
也就是說,
void CFather::Test()
{?
???? printf("我是老子\r\n");?
???? Hello();
}
中的Hello()不是調用的CFather的Hello,而是CSon的Hello函數。
??????? 以前寫了那么多代碼,還從來沒有寫過在一個虛函數中調用本類的另一個虛函數......,所以,對這種機制還一直不清楚。
??????? 更讓人誤會的是,在DEBUG狀態下,在CFather::Test函數的Hello()行設置斷點,使用調試器查看, 其調用的函數是CFather類的函數,而不是CSon類的函數(VS2008實際測試沒有出現這個現象)。
??????? 經過這個事件,可以發現虛函數也不是亂定義的。有些朋友可能喜歡將函數定義成虛函數,而不考慮是否符合虛函數的機制要求,因此容易產生一些自己不可理解的現象,產生很多的困惑。
對于此類問題,有什么不同看法,還請指正。
總結
以上是生活随笔為你收集整理的虚函数的“陷阱”的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。