[CareerCup] 13.3 Virtual Functions 虛擬函式

Grandyang發表於2015-10-30

 

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;
}

 

相關文章