生活随笔
收集整理的這篇文章主要介紹了
虚函数的“陷阱”
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
首先要說明,我不是一個理論派,很少努力的閱讀課外書籍,只是用到的時候才去找。因此理論上有缺失,導(dǎo)致對本文出現(xiàn)的“陷阱”認識不足。當(dāng)然,對于一些專業(yè)知識比較強的朋友來說,這不是“陷阱”,只是對我當(dāng)前的知識水平而言。
??? 先舉個例子吧,更好說明情況。假設(shè)有兩個類,有兩個虛函數(shù)。
[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()會輸出什么結(jié)果呢?
?實際的結(jié)果是:
我是老子
兒子在HELLO
?
也就是說,
void CFather::Test()
{?
???? printf("我是老子\r\n");?
???? Hello();
}
中的Hello()不是調(diào)用的CFather的Hello,而是CSon的Hello函數(shù)。
??????? 以前寫了那么多代碼,還從來沒有寫過在一個虛函數(shù)中調(diào)用本類的另一個虛函數(shù)......,所以,對這種機制還一直不清楚。
??????? 更讓人誤會的是,在DEBUG狀態(tài)下,在CFather::Test函數(shù)的Hello()行設(shè)置斷點,使用調(diào)試器查看, 其調(diào)用的函數(shù)是CFather類的函數(shù),而不是CSon類的函數(shù)(VS2008實際測試沒有出現(xiàn)這個現(xiàn)象)。
??????? 經(jīng)過這個事件,可以發(fā)現(xiàn)虛函數(shù)也不是亂定義的。有些朋友可能喜歡將函數(shù)定義成虛函數(shù),而不考慮是否符合虛函數(shù)的機制要求,因此容易產(chǎn)生一些自己不可理解的現(xiàn)象,產(chǎn)生很多的困惑。
對于此類問題,有什么不同看法,還請指正。
總結(jié)
以上是生活随笔為你收集整理的虚函数的“陷阱”的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。