小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

c++繼承關(guān)系中成員函數(shù)的重載、重寫(xiě)、重定義之間的區(qū)別

 頭號(hào)碼甲 2021-04-26

1、Override、Overload、Redefine

  • Overload
    重載只能發(fā)生在類(lèi)內(nèi)部,不能發(fā)生在子類(lèi)和父類(lèi)的繼承中。具體來(lái)說(shuō),如果子類(lèi)中有父類(lèi)同名、同返回值類(lèi)型,但是不同參數(shù)列表,這兩個(gè)在不同類(lèi)的函數(shù)是不能發(fā)生重載的。

  • Override
    重寫(xiě)即就是子類(lèi)將父類(lèi)中的方法進(jìn)行改寫(xiě)。在實(shí)例化Parent *p = new Son(),即創(chuàng)建指針類(lèi)型為父類(lèi),指向子類(lèi)空間的指針,能看到重寫(xiě)和重定義的區(qū)別。

  • Redefine
    重定義亦是發(fā)生在在繼承的過(guò)程中,這個(gè)和重寫(xiě)容易發(fā)生混淆。主要區(qū)別根據(jù)父類(lèi)中被重寫(xiě)或重定義的成員函數(shù)有無(wú)virtual關(guān)鍵字來(lái)討論。如果沒(méi)有virtual關(guān)鍵字,只要函數(shù)名相同,都會(huì)發(fā)生函數(shù)的重定義,或者說(shuō)隱藏,即子類(lèi)成員函數(shù)隱藏父類(lèi)同名的成員函數(shù);如果有virtual關(guān)鍵字,首先要保證返回值類(lèi)型要相同(個(gè)人在測(cè)試中發(fā)現(xiàn),在子類(lèi)中,只有將保持返回值類(lèi)型、函數(shù)名相同,才能進(jìn)行下一步的重寫(xiě)或重定義),再判斷是發(fā)生重載還是重定義,如果參數(shù)列表相同,則發(fā)生重寫(xiě),如果不相同,則是重定義。


2、三者之間的區(qū)別

  • 重載 overload

    • 發(fā)生在相同的作用域(子類(lèi)和父類(lèi)不在同一個(gè)作用域)
    • 函數(shù)名要相同
    • 參數(shù)列表不同,包括參數(shù)類(lèi)型、參數(shù)個(gè)數(shù)、參數(shù)的順序
    • 有無(wú)virtual關(guān)鍵字都可以發(fā)生
    • 返回值可以不同
  • 重寫(xiě) override

    • 不同的作用域(兩個(gè)同名函數(shù)分別在父類(lèi)和子類(lèi))
    • 相同的函數(shù)名
    • 相同的參數(shù)列表
    • 被重寫(xiě)父類(lèi)中的成員函數(shù)必須有關(guān)鍵字'virtual'
    • 相同的返回值類(lèi)型
    • 被重寫(xiě)的成員函數(shù)訪問(wèn)權(quán)限可以被修改,public、protect 或者其他。
  • 重定義 redefine

    • 不同的作用域
    • 函數(shù)名相同
    • 返回值類(lèi)型可以不同(沒(méi)有關(guān)鍵字virtual的情況),但是如果有virtual關(guān)鍵字,必須保證返回類(lèi)型相同,否則編譯報(bào)錯(cuò)。
    • 父類(lèi)函數(shù)沒(méi)有關(guān)鍵字virtual,參數(shù)列表可同可不同;父類(lèi)函數(shù)有關(guān)鍵字virtual,參數(shù)列表必須不同。

舉個(gè)例子說(shuō)明一下:

class Base{
public:
    int param3 = 0;
    void func1(){cout<<"This is Base::func1()"<<endl;}
    void func2(int a){cout<<"This is Base::func2(int a)"<<endl;}
    void func2(char c){cout<<"This is Base::func2(char c)"<<endl;}
    void func3(){cout<<"This is Base::func3()"<<endl;}
    virtual void func4(){cout<<"This is Base::func4()"<<endl;}
    virtual void func5(){cout<<"This is Base::func5()"<<endl;}
    virtual int func6(){cout<<"This is int Base::func6()"<<endl;}
};

class Son: public Base
{
public:
    int param = 1;
    int func1(){cout<<"This is Son::func1()"<<endl;}
    void func2(double e){cout<<"This is Son::func2()"<<endl;}
    void func3(){cout<<"This is Son::func3()"<<endl;}
    void func4(){cout<<"This is Son::func4()"<<endl;}
    void func5(int a){cout<<"This is Son::func5(int a)"<<endl;}
//    double func6(){cout<<"This is Son::func6()"<<endl;}
};

int main() {
    Son s;
    Base b;
    Base *bp = new Son();
    s.func1();
    s.func2(1.1);
    s.func2('c');
    s.func4();
    s.func5(2);
    cout<<"--------------------------------"<<endl;
    b.func1();
    b.func2(1);
    b.func2('c');
    b.func3();
    cout<<"--------------------------------"<<endl;
    bp->func1();
    bp->func2(1);
    bp->func2('e');
    bp->func3();
    bp->func4();
    bp->func5();
    return 0;
}

輸出如下:

This is Son::func1()
This is Son::func2()
This is Son::func2()
This is Son::func4()
This is Son::func5(int a)
--------------------------------
This is Base::func1()
This is Base::func2(int a)
This is Base::func2(char c)
This is Base::func3()
--------------------------------
This is Base::func1()
This is Base::func2(int a)
This is Base::func2(char c)
This is Base::func3()
This is Son::func4()
This is Base::func5()

分別創(chuàng)建子類(lèi)、父類(lèi)、指針類(lèi)型為父類(lèi)指向子類(lèi)空間的指針。(1)父類(lèi)中的func2發(fā)生重載,主要在父類(lèi)內(nèi)部產(chǎn)生(應(yīng)該說(shuō)相同作用域),因?yàn)榻os.func2('c')傳入字符的時(shí)候,只會(huì)調(diào)用子類(lèi)函數(shù),不會(huì)調(diào)用父類(lèi)的func2(char c)。而子類(lèi)中的func2對(duì)父類(lèi)的func2發(fā)生了重定義,并對(duì)其做了隱藏,所以調(diào)用的時(shí)候才會(huì)調(diào)用到子類(lèi)的func2(double )。從s.func1()、s.func2()、s.func3()都發(fā)生了重定義,所以在繼承的過(guò)程中,如果沒(méi)有virtual關(guān)鍵字,只要函數(shù)名相同,不管參數(shù)類(lèi)型、返回值類(lèi)型,都會(huì)發(fā)生重定義。(2)針對(duì)有virtual關(guān)鍵字的情況,在函數(shù)名相同的情況下,首先要保證返回值類(lèi)型相同,否則編譯不過(guò),如果參數(shù)列表相同,則發(fā)生重寫(xiě),不同則發(fā)生重定義,例如bp->func4()bp->func5(),這里bp調(diào)用函數(shù)的處理取決于是否重寫(xiě)的函數(shù)(虛函數(shù)的特性)。


參考文獻(xiàn)

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多