繁体   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