2013-10-07 29 views
4

在C++的,動態綁定,考慮下面的例子中...機制而vptr和V表中C++

class Base 
{ 
    virtual void fun() 
    { 
    cout<<"Base"; 
    }  
}; 

class Derived : Base 
{ 
    void fun() 
    { 
    cout<<"Derived"; 
    } 
}; 

int main() 
{ 
    Base *bptr; 
    Derived d; 
    bptr=&d; 
    bptr->fun(); 
} 

上述函數的輸出被「派生」由於虛擬關鍵字的聲明/動態捆綁。

根據我的理解,將創建一個虛擬表(Vtable),其中包含虛擬函數的地址。在這種情況下,爲派生類創建的虛擬表指向繼承的虛擬fun()。並且bptr->fun()將被解析爲bptr->vptr->fun();。這指向了繼承的基類函數本身。我不完全清楚如何調用派生類函數?

+2

注意它是'int main',而不是'void main',並且類聲明需要以';'結尾。 –

+0

下面的答案看起來不錯,但如果你覺得有必要閱讀更多的主題,我建議[*在C++對象模型內*](http://www.amazon.com/Inside-Object-Model-Stanley -Lippman/dp/0201834545 /)(ISBN:978-0201834543)。 –

回答

5

通過這個環節virtual table and _vptr

它說,工作流會像..剛走到

  1. base_ptr-> base_vptr ---->檢查虛函數的基類的訪問。

  2. base_ptr-> derived_vptr-> virtual_function()--->調用/調用虛函數。

因此,派生類的虛函數被調用..希望你覺得它有幫助。

+0

提到這個鏈接已經...不提供完整的soln。你的觀點2說虛擬函數將被調用,這是問題所在。但在這種情況下派生必須被調用。 –

+0

@BlueDiamond:base_ptr-> derived_vptr-> virtual_function()--->調用/調用派生類中的虛函數。基類指針將包含派生虛擬指針(派生類虛擬指針指向派生類虛擬表) 。然後在調用虛函數時派生虛擬指針,調用派生類虛函數。 –

+0

不應調用派生的虛函數..派生類的虛函數是從基類繼承而來的。重載函數應該被調用... –

0

並且bptr-> fun()將被解析爲bptr-> vptr-> fun();.這指向基類函數本身。

錯誤。 Derived實例的vptr(每個實例中的隱藏字段)指向Derived vtable。

+0

更正爲繼承基類函數... –

+0

好的,你明白每個類都有自己的vtable(表示每個虛擬方法應該使用哪個實現),並且每個實例的vptr指向正確的vtable,匹配對象的實際(動態)類型。什麼不見​​了? – Kos

+0

也許缺少的鏈接是Derived的'fun'也是(隱式)虛擬的?這是暗示的,因爲'fun'類型簽名是相同的。 – Kos

-1

該標準未指定實現多態性的機制。所有標準都說它應該如何工作 - 而不是編譯器廠商應該如何實現它。

就這麼說,就Linux下的GCC和Windows下的MSVC而言,你有它幾乎正確,我期望大多數其他編譯器是類似的。

+0

更正爲繼承的基類功能.. –

+0

有道理。 .Vtable只包含虛函數的地址。但是派生函數將如何被調用? vtable不包含non-virtual函數的地址rit ..我想弄清楚這個... –