将 final 关键字添加到没有基类(未派生)的类中的虚函数是否有意义

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

本文关键字:有意义 是否 函数 派生 添加 关键字 final 基类      更新时间:2023-10-16

我正在阅读一个很棒的 C++11 教程,作者在解释 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()被覆盖。

如果您没有将函数标记为virtualfinal则子类仍然可以实现该函数并隐藏基类函数。

通过使函数virtualfinal子类不能覆盖隐藏函数。

是的!在您提供的示例中,final 关键字可防止任何派生类重写f()正确说法。如果函数是非虚拟的,则允许D:f()隐藏函数的基类版本:

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

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

你的直觉是对的:让一个函数virtual只是立即用final封盖它,与非虚函数相比没有任何好处。这只是演示该功能的简短示例片段。

此外,如其他答案中所述,这实际上破坏了函数隐藏 - 您将永远无法在D或其任何派生类中拥有具有相同参数列表的f函数。
这是当您决定在模型中限制f时要完成的权衡。由于无法在此处执行实际的虚拟呼叫,因此您基本上具有缺点,没有任何好处。