2012-04-20 71 views
0

考慮下面的代碼塊:如何在運行時確定對象的基礎類型?

class BaseClass 
{ 
public: 
    virtual void hello() { cout << "Hello from Base" << endl; } 
}; 

class DerivedClass : public BaseClass 
{ 
public: 
    void hello() { cout << "Hello from Derived" << endl; } 
}; 

int main() 
{ 
    BaseClass base; 
    DerivedClass derv; 

    BaseClass* bp = &base; 
    bp->hello(); 
    bp = &derv; 
    bp->hello(); 
} 

怎樣的類型,英國石油公司在決定指着運行?我知道它是動態綁定的,但是這樣做的機制是什麼? 我很困惑,因爲通常答案是編譯器,但是因爲它是動態的,所以在這個例子中不是這種情況(或者我錯了嗎?我假設編譯器提前提前,但是現在是什麼表示bp指向DerivedClass?)。我也來自C#,所以這個想法對我來說是陌生的,因爲這是沒有CLR的本地代碼。

+1

[C++編譯器如何知道調用虛函數的實現?](http://stackoverflow.com/questions/203126/how-does-the-c-compiler-know-which-實現一個虛擬功能到校準) – 2012-04-20 18:51:49

+0

確實,我找不到問題。我應該關閉這個嗎? – Riken 2012-04-20 19:02:01

回答

6

構建DerivedClass時,會在其數據中插入不可見成員。該成員指向一個叫做vtable的東西。 vtable具有指向派生類的虛函數實現的函數指針。

每個具體類(您可以實例化的類)都有自己的vtable,它在內存中的某處。如果你有虛擬函數,這些表格只會被生成,這是C++關於不支付你不使用的東西的箴言的一部分。

當編譯器看到bp->hello()時,它知道要查找該vtable指針,並調用正確的函數。

+0

謝謝,我正在尋找什麼。 – Riken 2012-04-20 19:03:08

相關問題