[英]static inline in class inheritance
我正在阅读一些Epic Games的UnrealEngine4源代码,并看到一些让我想知道是否会错过一些必要的C ++魔术的实践。
类声明中的静态内联成员方法。 这里 @dividebyzero用户实际上揭示关于使用静态内联,至少与GCC编译器的作用非常重要的信息-直列布局类似于宏函数的行为。
我能看到的另一个有趣的实践是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.