在C++中,虛函數表(vtable)是一種實現動態綁定的機制。當一個類包含至少一個虛函數時,編譯器會為該類創建一個虛函數表。虛函數表是一個函數指針數組,其中每個元素都是一個指向類中虛函數的指針。
動態綁定是指在運行時根據對象的實際類型來調用相應的函數。這是通過虛函數表實現的。當一個類繼承自另一個類,并且重寫了基類中的虛函數時,編譯器會為派生類創建一個新的虛函數表,并將派生類中的虛函數指針添加到該表中。當使用基類指針或引用調用虛函數時,程序會根據指針或引用指向的對象的實際類型來查找對應的虛函數表,并調用相應的函數。
以下是一個簡單的示例:
#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()",動態綁定成功
delete base_ptr;
return 0;
}
在這個示例中,Base
類包含一個虛函數 foo()
,Derived
類重寫了這個函數。在 main()
函數中,我們使用基類指針 base_ptr
指向一個 Derived
對象,并調用 foo()
函數。盡管 base_ptr
的類型是 Base*
,但在運行時,程序會根據 base_ptr
指向的對象的實際類型(即 Derived
)來查找虛函數表,并調用 Derived::foo()
函數。這就是動態綁定的實現。