【问题标题】:Why "override/final" need to placed after function declarator?为什么“覆盖/最终”需要放在函数声明符之后?
【发布时间】:2017-11-02 22:18:38
【问题描述】:

我一直想知道这个决定,为什么 overridefinal 必须在成员函数声明符之后:

struct Base {
    virtual void virtFun();
};
struct Foo: Base {
    virtual void virtFun() override;
};

对我来说,用override/final 代替virtual 会更合乎逻辑:

struct Base {
    virtual void virtFun();
};
struct Foo: Base {
    override void virtFun();
};

这背后有什么原因吗?可能是 C++11 之前的兼容性问题?

【问题讨论】:

  • 也可以virtual void virtFun() override
  • 鉴于“覆盖”是一个新关键字,我想不出任何技术原因。谁想到了“覆盖”关键字,就完全武断地决定了它的归属。没有什么特别的原因。
  • Why are override and final identifiers with special meaning instead of reserved keywords?密切相关...override and final end up being used in the grammar in places where no user identifiers can appear. So in those places the identifiers can have a special meaning and outside of those contexts they can be treated as a regular identifier leaving the identifiers available for users.
  • @ShafikYaghmour tl;dr;就像 op 猜测的那样,保持与 C++11 前代码的兼容性基本上是一种诡计。因此,语言语法变得比以前更加一致。我认为更好的想法是要求编译器在某些标识符和“指定”之间的名称冲突时发出警告作为第一步,然后将这些“说明符”作为适当的保留关键字。
  • 一个体面的术语是“上下文关键字”,它只有在出现在正确的位置时才有意义。并且编译器只有在对语句的上下文足够了解时才会对其进行特殊处理。将它放在语句的末尾会有所不同,解析器已经非常清楚您正在编写函数声明,因此不需要关键字提供的那种帮助。与经历相同演变的Java相比,他们必须写@Override。 @ 很丑,但确实允许它出现在声明的开头。

标签: c++


【解决方案1】:

这是因为overridefinal 不是keywords

相反,它们是特殊的标识符

这意味着您实际上可以使用这些名称声明变量、函数或类型名称(类型别名或类)。

它们只能在非常小的上下文中用作成员函数修饰符,其中编译器在解析源代码时必须事先知道上下文。将它们放在函数声明之后是从 C++ 语法中消除该上下文歧义的一种非常简单的方法。

【讨论】:

  • 这意味着如果他们在virtual的位置,你会遇到一些问题:final myFunction();是一个返回final数据类型的函数。至少,允许final / override 在那个位置会使语法复杂化,但它可能是模棱两可的
  • 感谢您的回答!但是,它们可能是虚拟位置的特殊标识符,不是吗?在那里,只有类型可以,它似乎没有那么困难。有了这个,变量,函数仍然可以用这些名称指定,只有类型不能。
  • @geza 问题是这些名称也可以用于类型名称。你甚至可以定义一个名为overrideclass。不允许某些类别的标识符使用某些名称是一个非常滑的斜坡。
  • 好的 :) overridefinal 不是一个可能的类型名称。对我来说,在 virtual 的地方使用 override/final 的好处比我不能将它们用作类型名称要高得多。但现在我明白了这背后的决定,但我不同意。
  • @geza 引入新的关键字可能会破坏很多现有代码(因此在标准化过程中是一个非常高的障碍)。所以这是一种妥协。如果将它们添加为关键字,则任何带有overridefinal 的现有程序都将无法编译,并且更改的提议者必须“成本证明”对标准的潜在破坏性更改。跨度>
猜你喜欢
  • 1970-01-01
  • 2018-02-11
  • 1970-01-01
  • 2011-06-13
  • 1970-01-01
  • 1970-01-01
  • 2010-09-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多