在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)。