孫鑫VC++ 第三課 this指標的問題
阿新 • • 發佈:2019-02-09
最近看一個古老但經典的VC++視訊,看到第三課的時候,遇到一個小小的比較特殊的問題,就是子類的物件呼叫父類時,在父類裡的this指標指向的是子類的物件。邏輯上感到有點混亂,用一段程式碼加以驗證。
#include <iostream.h> class PARENT{ int d; public: PARENT() { d=1; cout<<"PARENT this ="<<this<<endl; cout<<"d="<<this->d<<endl; } }; class CHILD : public PARENT { int b; public: CHILD():PARENT() { b=2; cout<<"CHILD this = "<<this<<endl; cout<<"b="<<this->b<<endl; } }; int main(int argc, char* argv[]) { CHILD cb; cout<<"CHILD object cb's addr is="<<&cb<<endl; return 0; }
上面程式碼和孫鑫第三課中提到的this指標部分的MFC的程式碼原理一樣!此程式碼執行的結果你會發現this的值都一樣!而且this都是指向cb物件的! 因為this指標式在建立一個物件時,隱含的將物件的地址賦予一個指標,那就是this指標。在建立物件cb時,先講cb的首地址賦給this,根據繼承性,首先呼叫基類的建構函式,雖然此時cb物件還未完全建立(必須呼叫完子類的建構函式時,此時物件才會建立完畢),但是此時cb物件的基類部分已經構造完畢,所以這時候的this指標可以看成是cb的this指標,但是隻能呼叫基類PARENT的資料成員。如果此時你在PARENT()里加上一句cout<<"b="<<this->b<<endl;讓其呼叫子類的資料成員,則會報錯!因為this指向的物件沒有構造子類的部分!在執行完基類的建構函式進入子類的建構函式後,這時候this指向的物件構造完成,這時候this指標也就是一個真正的的指向cb的常指標了。