溫馨提示×

C++虛函數(shù)表怎樣實現(xiàn)動態(tài)綁定

c++
小樊
81
2024-11-09 06:25:34
欄目: 編程語言

在C++中,虛函數(shù)表(vtable)是一種實現(xiàn)動態(tài)綁定的機制。當一個類包含至少一個虛函數(shù)時,編譯器會為該類創(chuàng)建一個虛函數(shù)表。虛函數(shù)表是一個函數(shù)指針數(shù)組,其中每個元素都是一個指向類中虛函數(shù)的指針。

動態(tài)綁定是指在運行時根據(jù)對象的實際類型來調(diào)用相應的函數(shù)。這是通過虛函數(shù)表實現(xiàn)的。當一個類繼承自另一個類,并且重寫了基類中的虛函數(shù)時,編譯器會為派生類創(chuàng)建一個新的虛函數(shù)表,并將派生類中的虛函數(shù)指針添加到該表中。當使用基類指針或引用調(diào)用虛函數(shù)時,程序會根據(jù)指針或引用指向的對象的實際類型來查找對應的虛函數(shù)表,并調(diào)用相應的函數(shù)。

以下是一個簡單的示例:

#include <iostream>

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

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

int main() {
    Base* base_ptr = new Derived();
    base_ptr->foo(); // 輸出 "Derived::foo()",動態(tài)綁定成功
    delete base_ptr;
    return 0;
}

在這個示例中,Base 類包含一個虛函數(shù) foo()Derived 類重寫了這個函數(shù)。在 main() 函數(shù)中,我們使用基類指針 base_ptr 指向一個 Derived 對象,并調(diào)用 foo() 函數(shù)。盡管 base_ptr 的類型是 Base*,但在運行時,程序會根據(jù) base_ptr 指向的對象的實際類型(即 Derived)來查找虛函數(shù)表,并調(diào)用 Derived::foo() 函數(shù)。這就是動態(tài)綁定的實現(xiàn)。

0