微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

关于 C++11 标准中“final”关键字的误导性描述?

如何解决关于 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 包括 finaloverride

foo中的函数B是派生的虚成员函数(甚至在virtual中没有声明为B)。根据上面引用的 C++11 标准,这是合法的。

但是下面的情况是什么:

class C
{
    virtual void bar() final;
}

根据 C++11 标准类 C 应该编译,尽管 virtualfinal 关键字是相反的。

因此,C++11 标准 9.2/8 美元让我有点困惑。它不够精确。我什至不知道这是否真的可以编译,以及它的行为是否定义良好。

解决方法

“虽然 virtualfinal 关键字是相反的”。不可以。您引用的声明仅说明您不能在同一声明中使用多个 override 或多个 final 关键字。 virtual 本身是可选的和多余的,如果给出了其中的任何一个。 C 和 B 中的 virtual 关键字是可选的,因为基类已经声明该方法为 virtual。 final 方法也始终是虚拟的。将 final 用于不是来自基类的重写方法是没有用的(并且可能是非法的 - 但不确定标准)。

在 C++ 标准的早期版本中,finaloverride 不存在,因此习惯上将覆盖声明为 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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?