虛擬函式意思

在C++程式設計中,「虛擬函式」(virtual function) 是指在類別中聲明的函式,它允許子類別重新定義這個函式的行為。當一個類別的函式被宣告為虛擬時,它告訴編譯器這個函式可能會在子類別中被覆寫(overridden)。這使得在基類的指標或參考上呼叫這個函式時,實際執行的將會是該指標或參 Reference 所指向的對象的實際類別中的覆寫版本,而不是基類中的原始版本。

虛擬函式通常用於實作多態性(polymorphism),這是一種軟體設計模式,允許你在不同的時間執行同樣的程式碼,但執行的是根據對象的實際類別所決定的特定功能。這使得程式更具有彈性,因為你可以在不改變原始程式碼的情況下,為現有的類別新增功能。

虛擬函式的工作原理是透過虛擬函式表(vtable)來實現的。每個包含虛擬函式的類別都會有一個對應的vtable,這個表是一個指向函式程式的指針陣列,這些函式對應於該類別中所有的虛擬函式。當你創建一個該類別的對象時,vtable的指針會被賦值給對象的vptr(虛擬函式指標)。這樣,當你透過指標或參考呼叫虛擬函式時,實際執行的是vptr所指向的vtable中的函式,而不是直接執行原始類別中的函式。

以下是一個簡單的C++程式碼示例,展示了虛擬函式的使用:

class Base {
public:
    virtual void show() {
        std::cout << "Base::show() called" << std::endl;
    }
};

class Derived : public Base {
public:
    void show() override {
        std::cout << "Derived::show() called" << std::endl;
    }
};

int main() {
    Base* bptr = new Derived;
    bptr->show(); // 這裡會呼叫 Derived::show(),而不是 Base::show()
    delete bptr;
    return 0;
}

在上面的程式碼中,Base 類別有一個虛擬函式 show()Derived 類別覆寫了 show() 函式。在 main() 函式中,我們創建了一個 Base 類別的指標 bptr,並將其指向一個 Derived 類別的對象。當我們透過 bptr 呼叫 show() 時,實際執行的是 Derived 類別中的覆寫版本,而不是 Base 類別中的原始版本,這就是虛擬函式的作用。