1. 程式人生 > >孫鑫VC++ 第三課 this指標的問題

孫鑫VC++ 第三課 this指標的問題

最近看一個古老但經典的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的常指標了。