透過動態綁定實現多態性,虛函數允許衍生類別物件呼叫自身版本的虛函數,即使該函數由基底類別聲明。具體來說:虛函數在基底類別中聲明,並使用 virtual 關鍵字。編譯器使用虛擬指標表動態尋找執行時期物件類型的函數實作。衍生類別物件總是呼叫其自身版本的虛擬函數,即使它是由基底類別聲明的。
虛函數在C++ 多態性中的角色
在物件導向程式設計(OOP) 中,多態性是一種允許物件以不同方式回應相同方法呼叫的特性。在 C++ 中,虛函數透過動態綁定實現多態性。
什麼是虛函數?
虛擬函數是基底類別中宣告並由衍生類別重寫的成員函數。在基底類別中宣告虛擬函數時,使用 virtual
關鍵字前綴。
虛擬函數的工作原理
當呼叫虛擬函數時,編譯器不會尋找基底類別中的函數實作。相反,它會查找運行時物件類型的函數實作。這意味著子類別物件始終呼叫其自身版本的虛擬函數,即使該函數是由基底類別聲明的。
虛擬指標表
虛函數呼叫涉及稱為虛指標表的特殊資料結構。對於每個具有虛擬函數的類,編譯器會建立一個虛指標表,其中包含指向該類虛擬函數的指標。當建立派生類別物件時,該物件包含指向其自身虛指標表的指標。
實戰案例
考慮以下範例:
class Shape { public: virtual void draw() const = 0; // 其他函数和变量 }; class Rectangle : public Shape { public: void draw() const override { // 绘制一个矩形 } }; class Circle : public Shape { public: void draw() const override { // 绘制一个圆 } }; int main() { Shape* shapes[] = {new Rectangle(), new Circle()}; for (Shape* shape : shapes) { shape->draw(); // 根据运行时类型调用正确的 draw() 方法 delete shape; } }
在這個範例中,Shape
類別宣告了一個虛函數draw()
。衍生類別 Rectangle
和 Circle
重寫了 draw()
方法以提供針對特定形狀的自訂實作。在 main()
函數中,我們建立了一個形狀數組並對每個形狀呼叫 draw()
方法。儘管所有形狀都宣告為基底類別類型,但它們會根據實際運行時類型呼叫正確的 draw()
方法,從而演示了虛函數在 C++ 中實現多態性的作用。
以上是C++ 中虛函數在多態性中扮演什麼角色?的詳細內容。更多資訊請關注PHP中文網其他相關文章!