C++類(lèi)方法的重載與覆蓋技巧

c++
小樊
87
2024-08-27 13:39:33

在C++中,類(lèi)方法的重載(Overloading)和覆蓋(Overriding)是兩個(gè)不同的概念。重載是指在同一個(gè)類(lèi)中定義多個(gè)同名的成員函數(shù),但它們的參數(shù)列表不同;覆蓋是指在派生類(lèi)中重新定義基類(lèi)中的虛函數(shù)。以下是關(guān)于這兩個(gè)技巧的一些建議:

  1. 重載(Overloading): a. 在同一個(gè)類(lèi)中定義多個(gè)同名的成員函數(shù)。 b. 這些同名函數(shù)的參數(shù)列表必須不同,可以是參數(shù)的類(lèi)型、個(gè)數(shù)或順序不同。 c. 函數(shù)的返回值類(lèi)型不能作為重載的判斷依據(jù)。 d. 重載函數(shù)的調(diào)用是通過(guò)編譯器根據(jù)傳遞的參數(shù)類(lèi)型和個(gè)數(shù)來(lái)確定的。 e. 重載函數(shù)可以是普通成員函數(shù)、靜態(tài)成員函數(shù)和全局函數(shù)。

示例:

class MyClass {
public:
    void print(int a) {
        cout << "Print int: " << a << endl;
    }

    void print(double b) {
        cout << "Print double: " << b << endl;
    }

    void print(string s) {
        cout << "Print string: " << s << endl;
    }
};
  1. 覆蓋(Overriding): a. 覆蓋是指在派生類(lèi)中重新定義基類(lèi)中的虛函數(shù)。 b. 基類(lèi)中被覆蓋的函數(shù)必須是虛函數(shù)(使用關(guān)鍵字virtual聲明)。 c. 派生類(lèi)中覆蓋的函數(shù)原型必須與基類(lèi)中的虛函數(shù)原型相同(返回值類(lèi)型、函數(shù)名、參數(shù)列表都相同)。 d. 派生類(lèi)中覆蓋的函數(shù)可以是公有、保護(hù)或私有的,但通常應(yīng)該與基類(lèi)中的虛函數(shù)具有相同的訪問(wèn)權(quán)限。 e. 如果派生類(lèi)中沒(méi)有覆蓋基類(lèi)中的虛函數(shù),那么派生類(lèi)對(duì)象調(diào)用該函數(shù)時(shí)將執(zhí)行基類(lèi)中的版本。

示例:

class Base {
public:
    virtual void show() {
        cout << "Base class show()"<< endl;
    }
};

class Derived : public Base {
public:
    void show() override { // 使用override關(guān)鍵字明確表示覆蓋
        cout << "Derived class show()"<< endl;
    }
};

總結(jié):重載是同一個(gè)類(lèi)中同名函數(shù)的不同實(shí)現(xiàn),而覆蓋是派生類(lèi)對(duì)基類(lèi)虛函數(shù)的重新實(shí)現(xiàn)。在實(shí)際編程中,合理地使用這兩種技巧可以提高代碼的可讀性和可維護(hù)性。

0