[英]Can I tell if a C++ virtual function is implemented
我希望能夠在運行時判斷類的實例是否實現了虛函數。 例如:
struct Base
{
virtual void func(int x) { <default behavior here> }
virtual void func2(int x) { <default behavior here> }
};
struct Deriv : Base
{
virtual void func(int x) override { <new behavior here> }
};
int main()
{
Base *d = new Deriv;
if(implements<Base::func(int)>(d)) // This should evaluate true
{}
if(implements<Base::func2(int)>(d)) // This should evaluate false
{}
}
我已經看到了這個,但它已經過時了,現在可能有一些 c++11/14 必須說的內容: 檢測 C++ 虛函數是否已在派生類中重新定義的方法
簡短的回答是:不。而且肯定不是以便攜的方式。
更長的答案:實際上,多態性的目標是讓用戶無法區分功能的來源。
即使開發人員不編寫代碼,編譯器仍可能為派生類生成函數的專用版本(為了更好的優化)。 這甚至會拋棄會檢查虛擬表的非便攜式實現......
然而,另一種方法是拋棄 C++ 自動運行時多態性,而是提供一個臨時實現。 例如,如果您要提供自己的虛擬表/指針機制,那么您將擁有更多控制權:
struct VirtualTable {
typedef void (*FuncType)(void*, int);
typedef void (*Func2Type)(void*, int);
FuncType func;
Func2Type func2;
};
並且您可以檢查函數指針是否等於默認值。
我現在想到的是有一個特殊的“計數器”變量,它會根據實現取值,如果調用基類函數則取零。 我認為這聽起來有點過時的風格,並嘗試立即找到更好的解決方案。 現在看例子:
struct Base
{
virtual void func(int x, int& implemented) {implemented = 0;}
};
struct Deriv : Base
{
virtual void func(int x, int& implemented) override {implemented = 1;}
};
如果函數在您的示例中是無效的,您也可以使用“返回代碼” - 只需返回已實現的值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.