派生類和基類中的成員變量名相同


當派生類中的成員變量和基類中同名,那么與函數同名一樣,基類中的同名變量會被隱藏。也就是通過派生類對象無法訪問基類的同名變量。

例一:

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()函數。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM