亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

C++函數(shù)重載、隱藏與覆蓋重寫(xiě)的精通指南

 更新時(shí)間:2022年01月25日 16:44:06   作者:禿頂?shù)拇a農(nóng)  
這篇文章主要給大家介紹了關(guān)于C++函數(shù)重載、隱藏與覆蓋重寫(xiě)的相關(guān)資料,這幾個(gè)名詞看著好像很像,不過(guò)其實(shí)一樣都不一樣,本文通過(guò)實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下

前言

對(duì)于C++函數(shù)而言,多個(gè)函數(shù)如果同名會(huì)有很多有意思的事情,從聲明的作用域來(lái)看,在橫向上同一個(gè)可訪問(wèn)作用域里面的同名函數(shù)可以進(jìn)行重載;而縱向上作用域?qū)τ诟缸永^承的派生類(lèi)來(lái)說(shuō),同樣的函數(shù)名稱(chēng)可以實(shí)現(xiàn)隱藏與覆蓋。(如果基類(lèi)成員函數(shù)是虛函數(shù),可以基于虛函數(shù)實(shí)現(xiàn)多態(tài),進(jìn)行動(dòng)態(tài)聯(lián)編)下面就詳細(xì)介紹下函數(shù)的重載、隱藏與覆蓋重寫(xiě)。

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ù)被隱藏(注意別與覆蓋混淆)。

總結(jié)

咋一看,感覺(jué)重寫(xiě)的功能基于隱藏是都可以實(shí)現(xiàn),那么為什么要區(qū)分重寫(xiě)和隱藏呢?其實(shí)這是C++語(yǔ)言層面的問(wèn)題了,C++基于virtual函數(shù)實(shí)現(xiàn)了多態(tài)性,并且可以進(jìn)行動(dòng)態(tài)聯(lián)編,但是隱藏其實(shí)是破壞了這種多態(tài)性,也就是說(shuō)父類(lèi)成員函數(shù)的virtual性,在被子類(lèi)成員函數(shù)的隱藏破壞后,無(wú)法傳遞給孫子類(lèi)了,所以還需要重寫(xiě)來(lái)遺產(chǎn)的家族傳遞。

  • 前提:函數(shù)名稱(chēng)相同,即要求是同名函數(shù);
  • 作用域:不在同一個(gè)橫向的作用域(分別位于派生類(lèi)與基類(lèi)的縱向作用域);
  • 要素:返回類(lèi)型可同可不同,參數(shù)亦可同可不同;
  • 是否虛函數(shù):前提是虛函數(shù),并且參數(shù)相同;

到此這篇關(guān)于C++函數(shù)重載、隱藏與覆蓋重寫(xiě)的文章就介紹到這了,更多相關(guān)C++函數(shù)重載、隱藏與覆蓋重寫(xiě)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • 12個(gè)關(guān)于C語(yǔ)言的有趣問(wèn)答

    12個(gè)關(guān)于C語(yǔ)言的有趣問(wèn)答

    這篇文章主要介紹了12個(gè)關(guān)于C語(yǔ)言的有趣問(wèn)答,有助于讀者加深對(duì)C語(yǔ)言程序設(shè)計(jì)的理解,需要的朋友可以參考下
    2014-07-07
  • QT實(shí)現(xiàn)按鈕開(kāi)關(guān)Form窗體的效果的示例代碼

    QT實(shí)現(xiàn)按鈕開(kāi)關(guān)Form窗體的效果的示例代碼

    本文主要介紹了QT實(shí)現(xiàn)按鈕開(kāi)關(guān)Form窗體的效果的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-07-07
  • 在Visual Studio Code中配置C++編譯環(huán)境的問(wèn)題

    在Visual Studio Code中配置C++編譯環(huán)境的問(wèn)題

    關(guān)于Visual Studio Code對(duì)C++環(huán)境的配置方法應(yīng)該有好多種,我這里用到了其中的兩種,具體內(nèi)容詳情文中給大家詳細(xì)介紹,對(duì)Visual Studio Code配置C++編譯環(huán)境相關(guān)知識(shí)感興趣的朋友一起看看吧
    2021-07-07
  • 字符串的模式匹配詳解--BF算法與KMP算法

    字符串的模式匹配詳解--BF算法與KMP算法

    這篇文章記錄一下串里面的模式匹配,模式匹配,顧名思義就是給定一個(gè)被匹配的字符串,然后用一個(gè)字符串模式(模型)去匹配上面說(shuō)的字符串,看后者是否在前者里面出現(xiàn)。常用的有2種算法可以實(shí)現(xiàn),下面我們來(lái)具體探討下
    2014-08-08
  • 最新評(píng)論