如何解决关于 C++11 标准中“final”关键字的误导性描述?
class A
{
virtual void foo();
}
class B : public A
{
void foo() final;
}
引自 C++11 标准 § 9.2/8:
virt-specifier-seq 最多包含每个 virt-specifier 中的一个。 virt-specifier-seq 应仅出现在虚成员函数 (10.3) 的声明中
virt-specifier 包括 final
和 override
。
类foo
中的函数B
是派生的虚成员函数(甚至在virtual
中没有声明为B
)。根据上面引用的 C++11 标准,这是合法的。
但是下面的情况是什么:
class C
{
virtual void bar() final;
}
根据 C++11 标准类 C
应该编译,尽管 virtual
和 final
关键字是相反的。
因此,C++11 标准 9.2/8 美元让我有点困惑。它不够精确。我什至不知道这是否真的可以编译,以及它的行为是否定义良好。
解决方法
“虽然 virtual
和 final
关键字是相反的”。不可以。您引用的声明仅说明您不能在同一声明中使用多个 override
或多个 final
关键字。 virtual
本身是可选的和多余的,如果给出了其中的任何一个。 C 和 B 中的 virtual
关键字是可选的,因为基类已经声明该方法为 virtual。 final
方法也始终是虚拟的。将 final
用于不是来自基类的重写方法是没有用的(并且可能是非法的 - 但不确定标准)。
在 C++ 标准的早期版本中,final
和 override
不存在,因此习惯上将覆盖声明为 virtual 以提高可读性。现在您有了 override
,这不仅明显表明这是一个覆盖,而且如果不是,还会生成编译器错误(例如,因为覆盖类中的方法名称有错别字)。为了向后兼容,声明 virtual
and override
是合法的。
virtual void bar() final;
^^^^^
这就是 virt-specifier-seq。它包含 final
,它是一个 virt-specifier,并且有一个。
这是完全合法的。是这样的:
virtual void bar() final override;
^^^^^^^^^^^^^^
它在一个虚成员函数的声明中,并且每个virt-specifier最多包含一个。
什么是非法的
virtual void bar() final final;
^^^^^^^^^^^
在这里,它包含两个 final
,这违反了“每个 virt-specifier 最多一个”的规则。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。