虛擬函數允許衍生類別重寫基底類別方法,動態調派則根據物件類型在執行時決定要呼叫哪個函數。具體步驟包括:透過 virtual 聲明虛擬函數,允許衍生類別重寫。在衍生類別中重寫虛擬函數,提供特定實作。使用物件的指標或參考呼叫虛擬函數,編譯器將在執行時間根據物件類型在虛擬函數表中尋找並執行正確的函數。
C 虛擬函數與動態調派:瞭解執行階段方法呼叫的機制
##引言
虛擬函數是C 中一個強大的特性,允許在衍生類別中重寫基底類別的方法。本文將深入探討虛擬函數和動態調派的機制,並透過實戰案例進行示範。虛擬函數
虛擬函數是透過在函數宣告前面加上virtual 關鍵字宣告的。這表明該函數可以在衍生類別中被重寫。當呼叫一個物件上的虛擬函數時,實際呼叫的函數是根據程式運行時的物件類型決定的。
動態調派
動態調派是使用虛擬函數的一種機制,它允許在運行時確定要呼叫的函數。當呼叫一個物件的虛擬函數時,編譯器會在物件所屬類別的虛擬函數表中尋找該函數,並執行找到的函數。實戰案例
以下是一個示範虛擬函數和動態調派的實戰案例:#include <iostream> class Shape { public: virtual double area() = 0; // 纯虚函数 }; class Rectangle : public Shape { public: Rectangle(double width, double height) : _width(width), _height(height) {} double area() override { return _width * _height; } private: double _width; double _height; }; class Circle : public Shape { public: Circle(double radius) : _radius(radius) {} double area() override { return 3.14 * _radius * _radius; } private: double _radius; }; int main() { Shape* shapes[] = { new Rectangle(2, 3), new Circle(4) }; for (Shape* shape : shapes) { std::cout << shape->area() << std::endl; // 动态调派 } return 0; }在這個範例中,
Shape 是一個抽象基底類,它有一個純虛函數
area()。
Rectangle 和
Circle 是衍生類,實作了
area() 函數並提供了不同的實作。在
main 函數中,我們建立了一個
Shape 指標陣列。雖然這些指標指向不同的類型,但我們能夠透過該數組統一呼叫
area() 函數,編譯器會根據運行時的類型在適當的衍生類別中執行正確的函數。
結論
虛擬函數和動態調派是 C 中強大的機制,它們允許靈活地呼叫方法並實現運行時多態性。理解這些機制對於編寫健全且可擴展的程式碼至關重要。以上是C++ 虛擬函式與動態調派:瞭解執行階段方法呼叫的機制的詳細內容。更多資訊請關注PHP中文網其他相關文章!