2011-02-07 36 views
1

說我有以下幾點:如果調用非虛擬實現,將通過vtable調用函數嗎?

struct Base 
{ 
    virtual void callback() { /* */ } 
}; 

struct Derived : public Base 
{ 
    void callback() { /* */ } 
}; 

Base* obj = new Derived; 
static_cast<Derived*>(obj)->callback(); 

將調用回調通過虛函數表或直接調用函數調用,因爲它是未標記爲函數簽名虛擬?

+0

爲什麼static_cast? – 2011-02-07 19:41:17

回答

4

Derived::callback隱含地爲virtual,因爲具有相同返回類型和參數的Base::callback函數被聲明爲virtual

也就是說,是否使用vtable取決於編譯器以及它執行的優化。由於編譯器在這裏可以知道obj指向一個Derived對象,因此它知道對於callback虛擬函數的最終覆蓋是什麼,所以它可能在不查看vtable中的函數的情況下進行調用。不過它是否依賴於編譯器和優化設置。

+0

更新爲從基地派生。 – Graeme 2011-02-07 18:11:24