函數重寫允許子類覆蓋父類函數,從而解決父類缺陷和優化代碼結構。具體步驟如下:子類重寫父類具有相同名稱和簽名的函數,提供自己的實現。子類可以糾正父類設計缺陷或錯誤。重寫函數可以改善代碼的可維護性和可讀性。
C++ 函數重寫:覆蓋父類缺陷,優化代碼結構
函數重寫允許子類重新實現父類中具有相同名稱和簽名的函數。這提供了以下好處:
覆蓋父類缺陷:子類可以糾正父類中的設計缺陷或錯誤。
優化代碼結構:重寫函數可以改善代碼的可維護性和可讀性。
語法
在子類中重寫父類函數的語法如下:
returnType ChildClass::functionName(argumentList) { // 重寫后的函數體 }
登錄后復制
其中:
returnType
:重寫函數的返回類型。ChildClass
:派生類名稱。functionName
:要重寫的函數名稱。argumentList
:重寫函數的參數列表。
實戰案例:幾何形狀基類
考慮一個幾何形狀基類,它定義一個area
虛擬函數來計算形狀的面積:
class Shape { public: virtual double area() const = 0; };
登錄后復制
我們創建派生類Square
和Circle
,分別為正方形和圓形:
class Square : public Shape { public: Square(double sideLength) : sideLength(sideLength) {} double area() const override { return sideLength * sideLength; } private: double sideLength; }; class Circle : public Shape { public: Circle(double radius) : radius(radius) {} double area() const override { return M_PI * radius * radius; } private: double radius; };
登錄后復制
覆蓋父類缺陷
Shape
基類的area
函數是抽象的,因為它沒有具體實現。子類必須提供自己的實現。但是,對于像Circle
這樣的圓形,父類的area
函數是錯誤的,因為它不考慮圓周率π。
通過重寫Circle
類的area
函數,我們可以覆蓋父類缺陷并提供正確的面積計算:
class Circle : public Shape { public: Circle(double radius) : radius(radius) {} double area() const override { return M_PI * radius * radius; } private: double radius; };
登錄后復制
優化代碼結構
考慮另一個具有以下方法的Vector
類:
class Vector { public: void add(int x) { value += x; } void subtract(int x) { value -= x; } };
登錄后復制
我們可以通過重寫加法運算符,
重新設計這段代碼,從而提升代碼的可讀性和可維護性:
class Vector { public: Vector& operator+=(int x) { value += x; return *this; } Vector& operator-=(int x) { value -= x; return *this; } private: int value; };
登錄后復制
重寫運算符允許我們使用更簡潔且更清晰的語法來操作向量:
Vector v; v += 10; // 相當于 v.add(10) v -= 5; // 相當于 v.subtract(5)
登錄后復制
結論
函數重寫是 C++ 中一種強大的機制,它允許子類覆蓋父類缺陷并優化代碼結構。通過仔細考慮重寫函數的設計和實現,我們可以提高程序的健壯性、可讀性和可維護性。