gpt4 book ai didi

c++ - 类继承中的静态内联

转载 作者:行者123 更新时间:2023-12-03 12:47:21 40 4
gpt4 key购买 nike

我正在阅读一些 Epic Games UnrealEngine4 source code并看到一些实践,这些实践让我想知道我是否错过了一些基本的 C++ 魔法。

  1. class declaration 中的静态内联成员方法。 Here @dividebyzero 用户实际上透露了有关使用静态内联效果的非常重要的信息,至少对于 GCC 编译器来说是这样 - 内联放置类似于 MACRO 函数的行为方式。

  2. 我看到的另一个有趣的实践是 UE4 如何创建继承接口(interface)。以下是基于 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);
}
};

我什至不知道结构可以从类继承,反之亦然。

我知道静态+内联可以为每个函数调用生成唯一的函数体,这使得可以在子类的声明中放置不同的函数体但具有相同的签名。但后来我也想知道,如果可以像这样重写子类中的静态内联方法,为什么需要对小方法进行虚拟继承呢?为什么这种方法不常见? (至少从我的经验来看,我发现这种情况并不常见)

PS:我不确定这个问题格式是否适合 SO 或者应该放在 CodeReview 网站中。

最佳答案

首先,您引用的帖子似乎是关于命名空间范围内的静态内联函数。您的示例将它们放在类范围内。这两个范围之间存在很大差异。

在类作用域中,static 关键字使方法可在类上调用,而不是在实例上调用。因此,在这个范围内,静态、静态内联和仅内联之间存在非常明显的区别。

接下来,类作用域中的静态方法与继承无关,正是因为静态成员是类的一部分而不是实例的一部分。继承仅与实例相关。为了清楚地说明这一点,请考虑如何在 FOpenGLBase 或 FOpenGL3 上调用 UnmapBufferRange:

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

没有继承,因为您甚至无法覆盖它 - 您只需为另一个类重新定义它即可。这有效地隐藏了它,所以它看起来像继承,但并不相同!

关于c++ - 类继承中的静态内联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55373452/

40 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com