C++中的覆蓋與隱藏(詳細講解)


 

C++類中覆蓋與隱藏一直是一個容易理解出錯的地方,接下來我就詳細講解一下區別在何處

覆蓋指的是子類覆蓋父類函數(被覆蓋),特征是:

1.分別位於子類和父類中

2.函數名字與參數都相同

3.父類的函數是虛函數(virtual)

 

隱藏指的是子類隱藏了父類的函數(還存在),具有以下特征:

子類的函數與父類的名稱相同,但是參數不同,父類函數被隱藏

子類函數與父類函數的名稱相同,參數也相同,但是父類函數沒有virtual,父類函數被隱藏

  

class father
{
public:
    void show1()
    {
        cout << "father::show1" << endl<< endl;
    }

    virtual void show2()
    {
        cout << "father::show2" << endl << endl;
    }
};

class son:public father
{
public:
    void show1()
    {
        cout << "son::show1" << endl<< endl;
    }

    virtual void show2()
    {
        cout << "son::show2" << endl << endl;
    }
};

int main()
{
  father f;
  son s;

  father *pf=&s;
  son *ps=&s;

  pf->show1();
  pf->show2();
  
  return 0;
}

 

因為show1是非virtual函數,調用它的對象類型為靜態類型即父類(靜態聯編),所以調用的是父類的對象

但是show2為virtual函數,調用它的對象類型為動態類型即指針指向的類型(動態聯編),所以調用的是子類的類型

 

IF 子類的函數與父類的名稱相同,但是參數不同

  父類函數被隱藏

ELSE IF 子類函數與父類函數的名稱相同&&參數也相同&&但是父類函數沒有virtual

  父類函數被隱藏

ELSE IF 子類函數與父類函數的名稱相同&&參數也相同&&但是父類函數有virtual

  父類函數被覆蓋


免責聲明!

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



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