2012-11-06 53 views
1

也許是一個愚蠢的問題。如何確定函數是否在編譯時被覆蓋?

假設我有以下:

class A{ 
    int x; 
    int y; 
    virtual int get_thing(){return x;} 
}; 

class B : public A { 
    int get_think(){return y;} 
}; 

在上面的例子中,B :: get_thing返回X,因爲上位代碼有一個錯字。

如何確保在編譯時的get_thing函數已在類B中覆蓋,以便返回y?

+1

在特定的情況下,它是很簡單的:非虛函數永遠不會被覆蓋*。 –

+0

@DavidRodríguez-dribeas對,在例子中輸入錯誤。我的意思是,我沒有因爲某種原因虛擬出虛擬空間。 –

+0

你真的想要什麼?強制'B'的實現者重寫該函數?爲了確保'get_thing'的簽名與基礎中的虛擬函數相同? –

回答

8

假設A::get_thing是虛擬的,並且假定class Bclass A導出,並且你有C++ 11的支持,可以使用override special identifier

class B : public A{ 
    int get_think() override {return y;} 
}; 

這將產生一個編譯錯誤。請注意,這是基於方法的簽名,即其名稱,cv限定符和參數的類型。函數的返回類型或主體不在其中。

+0

啊!這正是我所期待的。並感謝您計算出儘管錯誤我的示例代碼! –

+2

'override'非關鍵字只會確保簽名與基礎中的虛擬函數的簽名相匹配,但它不會*確保'get_thing'在類B *中被覆蓋,並且更少*返回y * –

+2

在C++ 11之前有沒有辦法做這樣的事情? –

-1

首先你在你的例子中有一個錯誤,我認爲B應該是A的孩子,不是嗎?!

但答案是:你可以比較的函數地址(如果你想它的課程,並在編程的時候不能檢查):

if(reinterpret_cast<void*>(&B::get_think) != reinterpret_cast<void*>(&A::get_think)) { 
    std::cout << "B override A"; 
} else { 
    std::cout << "B override A"; 
} 
+1

這不是編譯時間,對吧? – Vikas

+1

您無法將PMF轉換爲void *,這肯定不是編譯器錯誤。 – Puppy

相關問題