【问题标题】:Why is virtual before declaration and override after? [duplicate]为什么在声明之前是虚拟的,之后是覆盖? [复制]
【发布时间】:2020-10-13 20:57:58
【问题描述】:

这是一道设计题,我们来个简单的方法:

virtual void Test() { };

我们可以用同样的方式覆盖它,甚至可能根本不指定virtual,但是有这个override关键字,它使编译器检查它实际上覆盖了一些东西,这很有用,但它需要写成这样:

void Test() override { };

对我来说,这毫无意义,因为我要编辑数千个这样的方法,而现在,编辑太笨拙了,不能花时间。那么在后面放置覆盖的逻辑是什么,因为它可能会更容易,而且对我来说通常更好:

override void Test() { };

【问题讨论】:

  • 我很好奇为什么virtual 排在首位。所有其他函数修饰符都放在声明的末尾。
  • 实际上对我来说虚拟是最重要的,所以把它放在那里很有意义。但我明白你的意思。无论如何,我认为 inline 和类似的东西也在开始。

标签: c++ overriding virtual-functions


【解决方案1】:

virtual 是在 C++ 开始时作为关键字引入的。这意味着您不能将其用作变量名、类名、函数名等。

override 很晚才出现。为了使其在 C++11 中的引入不会破坏现有代码,它并没有完全达到关键字的地位;而是称为具有特殊含义的标识符final 类似。

其奇怪的定位是由语言语法指定的:允许它位于开头将是一个重大变化的示例是

override :: foo bar()

其中override::foo 必须是函数bar() 的限定返回类型,而不是具有显式全局返回类型::foo 的覆盖器(确认@BenVoigt。)

【讨论】:

  • 嗯,这是真的,但它并不能解释它。它不能破坏现有代码,因为它一开始就不存在 :)
  • @mrzacekmrzacek 如果override 成为关键字,那么您将无法再使用override 作为变量名,这是个问题。
  • @mrzacekmrzacek 考虑以前版本的 C++ 中的代码可以使用 override 作为标识符。例如override foo(); 可以是一个返回override 类型对象的函数。
  • @mrzacekmrzacek 从来没有一个标准版本的 C++,其中 virtual 不是关键字,因此不可能有任何现有代码使用 virtual 作为标识符,可能会因包含而被破坏virtual 作为关键字。
  • @cigien:将被破坏的现有代码示例:override :: foo bar()。这是一个合格的返回类型 (override::foo),还是一个具有显式全局返回类型 ::foo 的覆盖器?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-09
  • 2018-06-28
  • 1970-01-01
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多