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

Edu*_*yan 27 c++ virtual-functions final c++11

我正在阅读一篇非常棒的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
};
Run Code Online (Sandbox Code Playgroud)

那么在这里使用final关键字是否有意义?在我看来,你可以避免在virtual这里使用关键字,防止f()被覆盖.

Som*_*ude 32

如果不将函数标记为virtual,final则子类仍然可以实现该函数并隐藏基类函数.

通过使函数virtualfinal子类无法覆盖隐藏函数.

  • 我知道一个上师会来.虽然我认为这在开销方面有点过多(可能会或可能不会被忽略),只是为了防止隐藏.+1. (3认同)
  • 显然在这个问题上已达成共识,但我想要解释一下如何做任何有用的事情*和*打破另一种语言特征将被视为一种好处. (3认同)
  • @Caleth:`class D:public B {virtual void f(int = 0); }`.谁说我不能"覆盖"`B :: f`?Quentin的解决方案`bB :: f()`_does_在这里按预期工作. (3认同)

Kar*_*oll 11

是! 在您提供的示例中,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
};
Run Code Online (Sandbox Code Playgroud)

通过使f()一个virtualfinal功能,在覆盖或隐藏任何尝试会导致编译错误.