簡體   English   中英

我可以判斷是否實現了 C++ 虛函數

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM