为什么声明前是虚拟的,声明后是重写的?
Why is virtual before declaration and override after?
这是一道设计题,来个简单的方法:
virtual void Test() { };
我们可以用同样的方式覆盖它,甚至可能根本不指定 virtual
,但是还有这个 override
关键字,它使编译器检查它实际上是否覆盖了某些东西,这是有用,但需要这样写:
void Test() override { };
对我来说这毫无意义,因为我实际上编辑了数千个这样的方法,而像现在这样,编辑太笨拙了,无法花时间。那么在后面放置覆盖的逻辑是什么,因为它可能更容易,对我来说通常更好:
override void Test() { };
virtual
是在 C++ 的开头作为 关键字 引入的。这意味着您不能将它用作变量名称、class 名称、函数名称等。
override
来得晚得多。为了使其在 C++11 中的引入不会破坏现有代码,它并没有完全达到关键字的地位;相反,它被称为具有特殊含义的 标识符 。 final
相似。
它的奇怪定位是由语言语法指定的:允许它位于开头将是一个重大更改的示例是
override :: foo bar()
其中 override::foo
必须是限定的 return 类型的函数 bar()
而不是具有显式全局 return 类型 ::foo
的覆盖程序(确认@BenVoigt。)
这是一道设计题,来个简单的方法:
virtual void Test() { };
我们可以用同样的方式覆盖它,甚至可能根本不指定 virtual
,但是还有这个 override
关键字,它使编译器检查它实际上是否覆盖了某些东西,这是有用,但需要这样写:
void Test() override { };
对我来说这毫无意义,因为我实际上编辑了数千个这样的方法,而像现在这样,编辑太笨拙了,无法花时间。那么在后面放置覆盖的逻辑是什么,因为它可能更容易,对我来说通常更好:
override void Test() { };
virtual
是在 C++ 的开头作为 关键字 引入的。这意味着您不能将它用作变量名称、class 名称、函数名称等。
override
来得晚得多。为了使其在 C++11 中的引入不会破坏现有代码,它并没有完全达到关键字的地位;相反,它被称为具有特殊含义的 标识符 。 final
相似。
它的奇怪定位是由语言语法指定的:允许它位于开头将是一个重大更改的示例是
override :: foo bar()
其中 override::foo
必须是限定的 return 类型的函数 bar()
而不是具有显式全局 return 类型 ::foo
的覆盖程序(确认@BenVoigt。)