C 虛擬函數是實現多態性的關鍵,它允許衍生類別覆寫父類別的行為:宣告為虛擬函數,並在衍生類別中出現。呼叫時,編譯器會根據物件類型動態解析正確的函數版本。純虛函數強制衍生類別提供自己的實現,以實現多態性。衍生類別覆蓋基底類別的虛擬函數,實作不同的行為。
C 虛擬函數詳解:解答多態機制之謎
引言
多態性是物件導向程式設計中的基石,它允許以不同的方式處理具有相同父類別的物件。 C 中的多態性主要是透過虛擬函數來實現的。本文將深入探討虛擬函數,揭開多型機制的神秘面紗。
虛擬函數的本質
虛擬函數是一種特殊類型的成員函數,它被宣告為虛擬函數,並出現在衍生類別的物件中。當呼叫虛擬函數時,編譯器會根據物件的實際類型在執行時間動態解析正確的函數版本。這種特性允許派生類別覆蓋父類別的行為,從而實現多態性。
語法
虛擬函數的宣告語法如下:
virtual 返回值类型 函数名(参数列表);
#例如:
class Shape { public: virtual double面积() const = 0; // 纯虚函数 };
純虛函數
純虛函數是一種特殊的虛擬函數,它沒有函數體,並且必須在衍生類別中實作。它迫使衍生類別提供自己的實現,從而強制實現多態性。
案例
為了展示虛擬函數的實際應用,讓我們考慮一個形狀抽象類別Shape
和其兩個衍生類別Circle
和Rectangle
:
class Shape { public: virtual double面积() const = 0; // 纯虚函数 }; class Circle : public Shape { public: Circle(double radius) : _radius(radius) {} double面积() const override { return M_PI * _radius * _radius; } private: double _radius; }; class Rectangle : public Shape { public: Rectangle(double width, double height) : _width(width), _height(height) {} double面积() const override { return _width * _height; } private: double _width, _height; }; int main() { Shape* circle = new Circle(5.0); Shape* rectangle = new Rectangle(10.0, 5.0); // 父类指针指向不同的派生类对象,但调用正确的面积函数版本 double areaCircle = circle->面积(); double areaRectangle = rectangle->面积(); std::cout << "圆的面积:" << areaCircle << std::endl; std::cout << "矩形的面积:" << areaRectangle << std::endl; return 0; }
在這個範例中,Shape
類別宣告了一個純虛函數面積()
。衍生類別 Circle
和 Rectangle
分別覆蓋了該函數,並實現了各自的面積計算。在 main
函數中,透過父類別指標存取衍生類別對象,並呼叫 面積()
函數,但會根據對象的實際類型執行正確的函數版本。
以上是C++ 虛擬函數詳解:解答多型機制之謎的詳細內容。更多資訊請關注PHP中文網其他相關文章!