2015-10-18 55 views
0

我希望能夠在運行時告訴一個類的實例是否實現了一個虛函數。例如:我可以告訴我是否實現了一個C++虛函數

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日現在必須說: Ways to detect whether a C++ virtual function has been redefined in a derived class

+0

也許我不明白你在問什麼。虛擬函數意味着在派生類中被覆蓋... – user5406764

+3

練習的最終目標是什麼?如果我將'Deriv'添加到'virtual void func2(int x){Base :: func2(x); }「爲什麼你想要這個事實 - 權利應該是一個沒有用的東西 - 改變你的程序的行爲? (無論如何,我認爲你可以。) –

+0

我已經添加了一些默認實現,所以你可以想象這些功能正在做什麼。他們在做什麼與我的問題沒有密切關係:我只想找出_if_函數是否被覆蓋。 – user5406764

回答

0

什麼在我腦海中,現在是有一個特殊的「計數器」變量,它將根據實現取其值,如果調用基類函數,則爲零。我認爲這聽起來有些過時,但試圖在一瞬間找到更好的解決方案。見例如現在:

struct Base 
    { 
     virtual void func(int x, int& implemented) {implemented = 0;} 

    }; 

    struct Deriv : Base 
    { 
     virtual void func(int x, int& implemented) override {implemented = 1;} 
    }; 

如果功能都是無效的,如你的榜樣,你也可以用「返回代碼」 - 剛剛返回實現價值了。

2

簡短的回答是:沒有。當然不是以便攜的方式。

更長的答案:實際上,多態性的目標是使其與功能來自用戶無法區分。

即使開發人員不編寫代碼,編譯器仍可能爲派生類生成專用版本的函數(以獲得更好的優化)。這將導致即使是非可移植的實現,它們將檢查虛擬表...

但是,另一種替代方法是拋棄C++自動運行時多態,而是提供臨時實現。例如,如果你要提供自己的虛擬表/指針機制,那麼你將有更多的控制權:

struct VirtualTable { 
    typedef void (*FuncType)(void*, int); 
    typedef void (*Func2Type)(void*, int); 

    FuncType func; 
    Func2Type func2; 
}; 

,你可以檢查函數指針是,或不是,等於默認。

相關問題