【发布时间】:2013-05-20 07:13:16
【问题描述】:
在 C++11 的 final 关键字的 various explanations 中,我看到了这样的示例。
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() final 而不是base::f() 的价值。在这种情况下,base::f() 可能有一个很好的基于设计的理由说明为什么f() 应该是虚拟的,而derived::f() 有一个很好的基于设计的理由说明为什么没有进一步的派生类应该覆盖其实现。
如果你不希望函数被多态覆盖,为什么不直接去掉 virtual 关键字呢?当然,派生类仍可能以非多态方式覆盖该函数。因此,基类中virtual void f() final 的目的是使base::f() 以任何方式都不可覆盖——无论是作为虚拟函数还是非虚拟函数?如果是这样,那么我们必须在这种情况下添加virtual 关键字才能启用final 的使用,这似乎有点不幸。我认为将非虚拟函数标记为最终函数应该是合法的。
当virtual 和final 的含义似乎矛盾时,为什么要对源自基类的函数使用virtual void f() final?
【问题讨论】:
-
例子是examples;它们旨在显示该功能的作用,而不一定是如何使用它。这种方式只使用两个类来显示
final的含义。要使用真实世界的示例将需要 三个:一个启动虚拟,一个从它派生并成为final,第三个尝试从它派生并重载它。这种方式更短。 -
@NicolBolas 我理解示例的目的。但是,这种特殊类型的示例是否也展示了一种有用的使用范式?就是这个问题。