C 函數指針在虛擬方法中用於儲存指向派生類別重寫方法實現的指針,在虛擬表中用於初始化虛表並存儲指向虛擬方法實現的指針,從而實現運行時多態,允許派生類別重寫基底類別中的虛擬方法,並根據運行時物件的實際類型呼叫正確的實作。
C 函數指標:虛擬方法和虛表的應用
在C 中,函數指標在實作虛擬方法和維護虛表方面發揮著至關重要的作用。本文將深入探討這些應用,並透過實戰案例加深理解。
虛擬方法
虛擬方法是基底類別中宣告的成員函數,由衍生類別重寫。當透過基底類別指標呼叫虛擬方法時,將根據運行時物件的實際類型呼叫派生類別的實作。
為了實作虛擬方法,編譯器會為每個基底類別建立一個虛擬函數表(vtable),其中儲存了指向每個虛擬方法實作的指標。當呼叫虛擬方法時,編譯器使用物件的 vtable 來尋找並呼叫正確的實作。
函數指標在虛擬方法中的應用
函數指標用於將指向虛擬方法實作的指標儲存在 vtable 中。編譯器為每個虛擬方法指派一個 vtable 條目,並將其填入指向該方法實作的函數指標。
例如:
class Base { public: virtual void print() { cout << "Base::print" << endl; } }; class Derived : public Base { public: virtual void print() override { cout << "Derived::print" << endl; } }; int main() { Base* base = new Derived; base->print(); // 输出 "Derived::print" }
在這個範例中,編譯器建立了一個 vtable,其中有兩個條目。第一個條目指向基底類別Base
中print()
方法的實現,第二個條目指向派生類別Derived
中重寫的print ()
方法的實作。當執行 base->print()
時,編譯器使用 vtable 取得恰當的函數指標並呼叫對應的實作。
虛擬表
虛表是一種資料結構,用於儲存指向虛擬方法實作的函數指標。虛表中的每個條目對應於基類中聲明的一個虛擬方法。
函數指標在虛表中的應用
函數指標用於初始化虛擬表並儲存指向虛擬方法實現的指標。當編譯器偵測到一個類別包含虛方法時,它會為該類別產生一個虛表。虛表中每個條目的類型都是對應方法傳回類型的函數指標。
在前面的範例中,編譯器會為基底類別Base
產生一個包含兩個條目的虛表:
vtable[Base] = { Base::print, Derived::print };
實戰案例
讓我們透過一個現實世界的範例進一步了解函數指標在虛擬方法和虛擬表中的應用。讓我們建立一個簡單的圖形繪製庫:
class Shape { public: virtual void draw() = 0; }; class Circle : public Shape { public: virtual void draw() override { cout << "Drawing a circle..." << endl; } }; class Square : public Shape { public: virtual void draw() override { cout << "Drawing a square..." << endl; } }; int main() { vector<Shape*> shapes; shapes.push_back(new Circle); shapes.push_back(new Square); for (auto shape : shapes) { shape->draw(); } }
在這個範例中,Shape
類別是基類,而Circle
和Square
#是派生類別。 draw()
方法是一個虛擬方法,由每個衍生類別重寫。編譯器為 Shape
類別建立了一個虛擬表,其中包含指向每個衍生類別 draw()
方法實作的函數指標。
當呼叫 shape->draw()
時,編譯器會使用物件的 vtable 取得適當的函數指標並呼叫正確的實作。這讓我們能夠透過一個統一的 Shape
介面來繪製不同類型的形狀,而無需明確轉換。
以上是C++ 函式指標在虛擬方法和虛表中的應用有哪些?的詳細內容。更多資訊請關注PHP中文網其他相關文章!