In various 解释C++11 的final
关键字,我看到这样的例子。
class base
{
public:
virtual void f() final;
};
class derived : public base
{
public:
virtual void f(); // Illegal due to base::f() declared final.
};
这实际上有用吗final
?为什么要在基类中声明一个虚函数(意味着它可以在派生类中有效地重写),然后立即将其标记为final
(否定这个暗示)?有什么用处virtual void f() final
?
我可以看到标记的价值derived::f()
最终而不是base::f()
。在这种情况下,base::f()
大概有一个基于设计的充分理由f()
应该是虚拟的,并且derived::f()
单独有一个很好的基于设计的理由,说明为什么任何进一步的派生类都不应重写其实现。
如果您不想多态地覆盖该函数,为什么不直接省略 virtual 关键字呢?当然,派生类仍可能以非多态方式重写该函数。目的是virtual void f() final
因此在基类中base::f()
绝对不可以任何方式重写——无论是作为虚拟函数还是非虚拟函数?如果是这样,那么我们必须添加virtual
在这种情况下关键字仅用于启用final
。我认为将非虚拟函数标记为最终函数也应该是合法的。
Why use virtual void f() final
对于源自基类的函数,当意义virtual
和感觉final
似乎矛盾?
将基类函数标记为虚拟函数和最终函数有什么意义吗?
是的,至少暂时如此。
我发现自己处于一个相对较大且不熟悉的现有 C++ 源代码库中。大部分代码是在 C++11 之前编写的。我发现我想确保基类中虚拟函数的所有重写都标记为override
。困难的部分是找到所有这些覆盖。
我在基类中标记了虚函数final
,编译器很快就向我展示了每个重写的声明位置。然后很容易按照我想要的方式装饰覆盖,并删除final
来自基类中的虚拟。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)