溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

C++函數(shù)重載、隱藏與覆蓋重寫(xiě)的方法是什么

發(fā)布時(shí)間:2022-01-26 09:01:58 來(lái)源:億速云 閱讀:217 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要介紹了C++函數(shù)重載、隱藏與覆蓋重寫(xiě)的方法是什么的相關(guān)知識(shí),內(nèi)容詳細(xì)易懂,操作簡(jiǎn)單快捷,具有一定借鑒價(jià)值,相信大家閱讀完這篇C++函數(shù)重載、隱藏與覆蓋重寫(xiě)的方法是什么文章都會(huì)有所收獲,下面我們一起來(lái)看看吧。

1 函數(shù)重載

  • 定義:

C++規(guī)定在同一作用域中,例如一個(gè)類(lèi)的成員函數(shù)之間,多個(gè)函數(shù)的名稱(chēng)相同,但是各個(gè)函數(shù)的形式參數(shù)(指參數(shù)的個(gè)數(shù)、類(lèi)型或者順序)不同時(shí),構(gòu)成函數(shù)重載。

  • 代碼示例

int test(int a);
int test(int a, double b);
int test(double b, int a);
int test(int a, const char ** c); 
void test(int a, const char ** c); 		  // 非重載,一起編譯會(huì)提示錯(cuò)誤,僅僅返回值不同編譯無(wú)法區(qū)分使用的是那個(gè)重載函數(shù)
  • 總結(jié)

  • 前提:函數(shù)名稱(chēng)相同,即要求是同名函數(shù);

  • 重載作用域:函數(shù)重載發(fā)生在橫向水平的同一作用域,例如一個(gè)類(lèi)成員函數(shù)之間的重載、全局函數(shù)之間的重載;

  • 重載類(lèi)型:無(wú)論是類(lèi)的靜態(tài)成員函數(shù),還是類(lèi)的普通成員函數(shù),亦或是普通的函數(shù),都可以形成重載;

  • 重載要素:函數(shù)返回值類(lèi)型函數(shù)重載無(wú)任何關(guān)系,僅僅返回值不同,形參相同的情況,會(huì)被禁止重載;

2 函數(shù)隱藏

  • 定義

函數(shù)隱藏是說(shuō),在不同作用域中,定義的同名函數(shù)構(gòu)成函數(shù)隱藏(僅僅要求函數(shù)名稱(chēng)相同,對(duì)于返回值和形式參數(shù)不做更多要求,并且對(duì)于是否是虛函數(shù)也不做要求)。例如派生類(lèi)同名成員函數(shù)屏蔽與其基類(lèi)的同名成員函數(shù),以及屏蔽同名全局外部函數(shù)。(經(jīng)常有人隱藏和覆蓋重寫(xiě)弄混,所以提前說(shuō)下,如果在派生類(lèi)中存在與基類(lèi)同名的虛函數(shù),并且返回值、形參都相同,則構(gòu)成函數(shù)重寫(xiě))。

  • 代碼示例

#include <iostream>

using namespace std;

class Parent
{
  public:
    void test(int a) {
      cout<<"this is Parent"<<endl;
    }
};

class Son: public Parent
{
  public:
    void test(int a) {
      cout<<"this is Son hide Parent function"<<endl;
    }
};

int main(int argc, char ** argv) {
  Son son;
  son.test(1);
  return 0;
}

輸出如下

root@localhost override [master] $ g++ --std=c++11 test_hide.cpp
root@localhost override [master] $ ./a.out
this is Son hide Parent function
  • 總結(jié)

  • 前提:函數(shù)名稱(chēng)相同,即要求是同名函數(shù);

  • 作用域:不在同一個(gè)橫向的作用域(分別位于派生類(lèi)與基類(lèi)的縱向作用域);

  • 要素:返回類(lèi)型可同可不同,參數(shù)亦可同可不同;

  • 虛函數(shù):

    參數(shù)不同,此時(shí)無(wú)論有無(wú)virtual關(guān)鍵字,基類(lèi)的函數(shù)將被隱藏;

    參數(shù)相同的情況下

    此時(shí)基類(lèi)函數(shù)無(wú)virtual則屬于函數(shù)隱藏,后續(xù)無(wú)法繼續(xù)基于此利用這個(gè)函數(shù)的多態(tài)性;

    如果是virtual則屬于函數(shù)重寫(xiě),繼續(xù)多態(tài)性的保留;

3 函數(shù)重寫(xiě)

  • 定義

函數(shù)的覆蓋和重寫(xiě)是一個(gè)意思的兩個(gè)叫法,同時(shí)他的作用域也和函數(shù)隱藏相同,其實(shí)可以這么看,函數(shù)覆蓋和函數(shù)隱藏共同構(gòu)建了在具有集成關(guān)系的縱向作用域里面的同名函數(shù)的不同衍變,只不過(guò)函數(shù)覆蓋的條件更加嚴(yán)格些。

在介紹函數(shù)隱藏的時(shí)候,為了弄清楚函數(shù)隱藏與覆蓋重寫(xiě),也簡(jiǎn)單描述了函數(shù)覆蓋。這里再進(jìn)一步進(jìn)行描述下:派生類(lèi)中與基類(lèi)中,同名函數(shù)的返回值類(lèi)型、參數(shù)的都相同,并且基類(lèi)中定義為虛函數(shù)的情況下,構(gòu)成虛函數(shù)覆蓋,也叫虛函數(shù)重寫(xiě)。

  • 代碼示例

#include <iostream>
using namespace std;
class Parent
{
  public:
    virtual void test(int a) {
      cout<<"this is Parent"<<endl;
    }
};

class Son: public Parent
{
  public:
    void test(int a) {
      cout<<"this is Son Override Parent function"<<endl;
    }
};

int main(int argc, char ** argv) {
  Son son;
  son.test(1);
  return 0;
}

輸出如下:

root@localhost override [master] $ g++ --std=c++11 test_override2.cpp
root@localhost override [master] $ ./a.out
this is Son Override Parent function

附:令人迷惑的隱藏規(guī)則

C++的隱藏規(guī)則使問(wèn)題復(fù)雜性陡然增加,這里“隱藏”是指派生類(lèi)的函數(shù)屏蔽了與其同名的基類(lèi)函數(shù),規(guī)則如下:

(1)如果派生類(lèi)的函數(shù)與基類(lèi)的函數(shù)同名,但是參數(shù)不同。此時(shí),不論有無(wú)virtual關(guān)鍵字,基類(lèi)的函數(shù)將被隱藏(注意別與重載混淆)。

(2)如果派生類(lèi)的函數(shù)與基類(lèi)的函數(shù)同名,并且參數(shù)也相同,但是基類(lèi)函數(shù)沒(méi)有virtual關(guān)鍵字。此時(shí),基類(lèi)的函數(shù)被隱藏(注意別與覆蓋混淆)。

關(guān)于“C++函數(shù)重載、隱藏與覆蓋重寫(xiě)的方法是什么”這篇文章的內(nèi)容就介紹到這里,感謝各位的閱讀!相信大家對(duì)“C++函數(shù)重載、隱藏與覆蓋重寫(xiě)的方法是什么”知識(shí)都有一定的了解,大家如果還想學(xué)習(xí)更多知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

c++
AI