在没有基础 class(未派生)的 class 中向虚函数添加 final 关键字是否有意义

Does it make sense to add final keyword to the virtual function in a class that has no base class (is not derived)

我正在读一本很棒的 awesome C++11 tutorial,作者在解释 final 关键字时提供了这个例子:

struct B {
    virtual void f() const final;   // do not override
    virtual void g();
};
struct D : B {
    void f() const;     // error: D::f attempts to override final B::f
    void g();       // OK
};

那么在这里使用 final 关键字有意义吗?在我看来,您可以避免在此处使用 virtual 关键字并防止 f() 被覆盖。

您的直觉是正确的:创建函数 virtual 只是为了立即用 final 限制它与非虚函数相比没有任何好处。这只是一个演示该功能的简短示例片段。

此外,如其他答案中所述,这实际上破坏了函数隐藏——您将永远无法在 D 或任何它派生 类.
当您决定在模型中限制 f 时,这是一个权衡。由于无法在此处执行实际的虚拟调用,因此您基本上处于劣势而没有优势。

如果你不将函数标记为virtualfinal那么child-class仍然可以实现该函数并隐藏base-class函数.

通过使函数 virtualfinal 子 class 无法覆盖 隐藏函数。

是的!在您提供的示例中,final 关键字会阻止任何派生的 classes 覆盖 f(),正如您所说的那样。如果该函数是非虚函数,则允许 D:f() 隐藏 函数的基本 class 版本:

struct B {
    void f() const;   // do not override
    virtual void g();
};
struct D : B {
    void f() const; // OK!
    void g();       // OK
};

通过使 f() 成为 virtualfinal 函数,任何覆盖或隐藏的尝试都会导致编译错误。