gpt4 book ai didi

c++ - 为什么覆盖出现在成员声明之后而不是与虚拟相同的地方?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:05:02 25 4
gpt4 key购买 nike

我很好奇为什么新的 C++11 关键字 override 被迫以与 const 一致的方式出现在方法声明之后,而不是 虚拟?

class SomeBaseClass {
virtual void DoPolymorphicBehavior() = 0;
...
class SomeDerrivedClass : public SomeBaseClass {
void DoPolymorphicBehavior() override;
...

为什么世界上不允许它在相同的确切位置(甚至代替)virtual

class SomeBaseClass {
virtual void DoPolymorphicBehavior() = 0;
...
class SomeDerrivedClass : public SomeBaseClass {
override void DoPolymorphicBehavior();
...

这将允许我在我的源文件中为派生类进行搜索和替换,以简单地使用 new 关键字,从而在查找错误时获得编译器的帮助。但是,由于 C++11 在语法上将其置于不同的位置,我必须手动更新数千行源代码才能从新的编译器功能中获益。

这个选择背后肯定有充分的理由吗?

最佳答案

出现在函数名之前的声明说明符序列可以包含一个标识符(例如,函数的返回类型)。假设一些现有代码的返回类型为 override:

override foo();

或者甚至是一个名为override的变量:

int override;

引入新关键字 override 会破坏任何包含名为 override 的标识符的现有代码,因为关键字是保留的。

因此,他们没有引入新关键字,而是引入了一个上下文关键字:override(以及final)。上下文关键词通过其句法位置被识别为关键词。在您的程序中使用名为 overridefinal 的标识符仍然没问题。如果这些标识符出现在函数声明中的参数列表之后,则它们具有特殊含义。

所以它放在函数参数之后的原因是因为引入新关键字会破坏旧代码,如果编译器在这里看到 override 他们就知道它的确切含义,因为这里不能出现其他标识符.

关于c++ - 为什么覆盖出现在成员声明之后而不是与虚拟相同的地方?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15119572/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com