重載、重寫和隱藏三者的區別


1.重載

重載:同一作用域內被聲明的幾個具有不同參數列表(參數類型,個數,順序不同)的同名函數,根據參數列表確定調用哪個函數,重載不關心函數返回類型。

class A
{
public:
    void Swap(int* a, int* b);       //overload
    int  Swap(long* a, long* b);     //overload
    void Swap(char* a, char* b);     //overload
    void Swap(double* a, double* b); //overload
};

 

2.重寫

重寫(覆蓋):是指派生類中存在重新定義的函數。其函數名,參數列表,都必須同基類中被重寫的函數一致,返回值類型除了協變情況下也必須和基類中被重寫的函數一致,只有函數體不同(花括號內)。派生類對象調用時會調用派生類的重寫函數,不會調用被重寫函數。基類中被重寫的函數必須有virtual修飾。協變情況:在C++中,只要原來的返回類型是基類類型的指針或引用,新的返回值類型是派生類的指針或引用,覆蓋的方法就可以改變返回類型,這樣的返回類型稱為協變返回類型。關於講解協變情況的鏈接:https://blog.csdn.net/sharp_up/article/details/53189414

// 3重寫了1
// 4重寫了2(協變情況)
class A
{
public:
    virtual void Swap(int* a, int* b); //1

    virtual A* get(char* str);         //2
};

class B : public A
{
public:
    virtual void Swap(int* a, int* b); //3

    virtual B* get(char* str);         //4
};

 

3.隱藏

隱藏(重定義):是指派生類的函數屏蔽了與其同名的基類函數,注意只要同名函數並且基類沒有virtual修飾,不管參數列表是否相同,基類函數都會被隱藏。

//派生類中3隱藏了1
//派生類中4隱藏了2
class A
{
public:
    void Swap(int* a, int* b); //1

    A* get(char* str);         //2
};

class B : public A
{
public:
    void Swap(int* a, int* b); //3

    B* get(char* str);         //4
};

 

4. 總結

類別 作用域 函數名 參數列表 返回值類型 是否有virtual修飾
重載 同一作用域 相同 不同 無要求 無要求
重寫(覆蓋) 不同作用域(父類和子類) 相同 相同 相同(協變除外) 父類函數必須有
隱藏(重定義) 不同作用域(父類和子類) 相同 無要求 無要求 父類函數不能有


免責聲明!

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



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