當派生類中的成員變量和基類中同名,那么與函數同名一樣,基類中的同名變量會被隱藏。也就是通過派生類對象無法訪問基類的同名變量。
例一:
class base { public: int a; int b; base() { a=10; b=20; } virtual void fun() { fun2(); } void fun2() { cout<<a<<b<<endl;//line 3 cout<<this->a<<this->b<<endl; //line 4 } }; class derive:public base { public: int a; derive() { a=30; b=40; } void fun() { cout<<this->a<<this->b<<endl; fun2();//line 2 } }; int _tmain(int argc, _TCHAR* argv[]) { base *b=new derive; b->fun();// line 1 return 0; }
輸出:30 40
10 40
10 40
下圖為程序中繼承示意圖。b為base基類指針,指向derive派生類,那么派生類將從基類繼承下來的那部分內容供基類指針b解引用。因此程序中line 1通過基類指針調用虛函數fun(),因為派生類中的虛函數覆蓋了基類中的虛函數,所以vptr指向的虛函數表中的fun()是derive::fun()。因此line 1 行調用派生類中虛函數fun()。fun()函數中的this指針派生類的指針,因此this->a和this->b是派生類中的this,因此輸出30,40。
line 2 行調用基類中的fun2,進入基類的函數中,line 3行的a和b指的是基類中的變量a,b,因此輸出10,40;line 4行與line 3行一樣,這里的this指針是基類的指針,即指針b。其實基類指針this和派生類指針this的值是一樣的,只不過基類的this只能訪問基類繼承下來的成員,派生類的this可以訪問基類繼承的以及派生出來的成員,所以派生類指針訪問成員變量a時,雖然有兩個a,一個是base::a,一個是derive::a,但是derive::a的存在,使得base::a被隱藏了,所以派生類的this訪問的是derive ::a。

例二:
class base { public: virtual void fun() { cout<<"base::fun"<<endl; } void fun2() { this->fun();// line 1 這里加不加this都一樣,除非改成base::fun();或者不加虛函數,當不加虛函數的時候就跟成員變量類似的調用順序,或者fun2是構造函數,構造函數中調用的是自己的本類的虛函數,跟對象類型無關 } }; class derive:public base { public: void fun() { cout<<"derive::fun"<<endl; } };
int _tmain(int argc, _TCHAR* argv[]) { base *b=new derive; b->fun2(); return 0; }
基類指針調用fun2()函數,line 1 行this->fun();這里的this指針是基類的指針,因為fun是虛函數,虛函數表中,派生類的虛函數覆蓋了基類的虛函數,所以調用的還是派生類中的fun()函數。
