簡體   English   中英

類繼承中的靜態內聯

[英]static inline in class inheritance

我正在閱讀一些Epic Games的UnrealEngine4源代碼,並看到一些讓我想知道是否會錯過一些必要的C ++魔術的實踐。

  1. 類聲明中的靜態內聯成員方法。 這里 @dividebyzero用戶實際上揭示關於使用靜態內聯,至少與GCC編譯器的作用非常重要的信息-直列布局類似於宏函數的行為。

  2. 我能看到的另一個有趣的實踐是UE4如何為繼承創建接口。以下是基於UE4中的OpenGL后端模塊的示例:

     class FOpenGLBase { public: static FORCEINLINE void UnmapBufferRange(GLenum Type, uint32 InOffset, uint32 InSize) UGL_REQUIRED_VOID }; 

其中UGL_REQURED_VOID被默認函數體替換,如果在此基類上調用,則報告“未實現”方法錯誤。

接下來繼承上面的類:

    struct FOpenGL3 : public FOpenGLBase
    {
        static FORCEINLINE void UnmapBuffer(GLenum Type)
        {
          glUnmapBuffer(Type);
        }
        static FORCEINLINE void UnmapBufferRange(GLenum Type, uint32 InOffset, uint32 InSize)
        {
           UnmapBuffer(Type);
        }
    };

我甚至不知道結構可以從類繼承而反之亦然。

我知道static + inline可以為每個函數調用生成唯一的函數體,這樣就可以在子類的聲明中放置不同的主體但具有相同的簽名。 但是我也想知道為什么如果可以像這樣覆蓋子類中的靜態內聯方法,為小方法需要虛擬繼承? 為什么這種方法不常見? (至少從我的經驗來看,我發現它並不常見)

PS:我不確定這個問題格式是否適用於SO,或者應該放在CodeReview網站中。

首先,您引用的帖子似乎與命名空間范圍中的靜態內聯函數有關。 您的示例將它們放在類范圍中。 這兩個范圍之間存在很大差異。

在類范圍中,static關鍵字使方法可以在類上調用,而不是在實例上調用。 所以在這個范圍內,靜態,靜態內聯和內聯之間存在非常真實的區別。

接下來,類范圍中的靜態方法與繼承無關,因為靜態成員是類的一部分而不是實例。 繼承僅與實例相關。 為了清楚說明,請考慮如何在FOpenGLBase或FOpenGL3上調用UnmapBufferRange:

FOpenGLBase::UnmapBufferRange(..); // Call the FOpenGLBase version
FOpenGL3::UnmapBufferRange(..); // Call the FOpenGL3 version

沒有繼承,因為你甚至無法覆蓋它 - 你只需將它重新定義為另一個類。 這有效地隱藏了它,所以它看起來像繼承,但它不一樣!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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