13.3 How do virtual functions work in C++?
這道題問我們虛擬函式在C++中的工作原理。虛擬函式的工作機制主要依賴於虛表格vtable,即Virtual Table。當類中定義了虛擬函式時,一個虛表格就建立了用來儲存該類的虛擬函式的地址。此時編譯器Compiler也會在該類中增加一個虛指標vptr(Virtual Pointer),用來指向虛表格。當一個虛擬函式在派生類中沒有被重寫時,派生類中的虛表格中仍然存的是基類的虛擬函式的地址。當虛擬函式被呼叫時,就要到虛表格中取找函式地址。C++中的動態繫結機制主要就是通過虛表格來實現的。
當我們將基類的指標指向一個派生類的實體時,虛指標vptr就指向派生類的虛表格,這樣就保證了派生類中的虛擬函式能被呼叫,參見如下程式碼:
class Shape { public: int edge_len; virtual int circumference() { cout << "Circumference of Base Class\n"; return 0; } }; class Triangle: public Shape { public: int circumference() { cout << "Circumference of Triangle Class\n"; return 3 * edge_len; } }; int main() { Shape *x = new Shape(); x->circumference(); // "Circumference of Base Class" Shape *y = new Triangle(); y->circumference(); // "Circumference of Triangle Class" return 0; }