覆盖为默认说明符...为什么不呢?

时间:2015-11-11 12:50:10

标签: c++ c++11

自从使用c ++ 11以来,我一直注意到,在从接口派生的类中,我总是使用覆盖说明符(对于我来说,人们通常想知道基础中的虚拟签名何时发生变化)。我几乎觉得连续指定覆盖是错误的,这让我想到了我的问题:

为什么标准委员会不决定覆盖默认值(在虚拟基础签名更改时生成编译器错误),同时添加关键字以明确“不关心”,例如override_ignore(不是我认为人们会想忽略这个)?

2 个答案:

答案 0 :(得分:2)

正如Nathan Oliver所说:向后兼容性(必要的邪恶)。虽然在术语“覆盖”上进行大规模替换相当容易。在代码库中,它只会成为已经不情愿的编程社区的另一个障碍。

另一个要点是代码可读性。如果您正在努力维护一个非常大的代码库的一小部分,那么更好可以在您的子类中使用覆盖说明符来提醒您:

  • 在不重构父类和所有兄弟类的情况下,不应该重构该方法,
  • 该方法是为了满足特定要求,
  • 有关该方法必要工作的任何信息都可以在父类中找到'报头中。

C ++并不专注于使代码本身尽可能小而有效 - 这就是为什么它很少能够赢得任何代码高尔夫挑战的原因。相反,它是一种专注于严谨的语言,并且在您所做的每件事情中都是明确的。至少,这是我对语言的看法,以及为什么(虽然一些常见的操作需要更多的时间来写出来而不是许多其他语言)当我需要在复杂的程序中清晰时,它是我的首选语言

答案 1 :(得分:2)

还要考虑以下情况:

struct A {
    virtual void foo();
}

struct B: public A {
    vitual void fog() override; 
}

您错误输入了 name 这个函数,这段代码会给您编译错误。但是,使用默认覆盖方法,编译器永远不会知道存在错误。