自从使用c ++ 11以来,我一直注意到,在从接口派生的类中,我总是使用覆盖说明符(对于我来说,人们通常想知道基础中的虚拟签名何时发生变化)。我几乎觉得连续指定覆盖是错误的,这让我想到了我的问题:
为什么标准委员会不决定覆盖默认值(在虚拟基础签名更改时生成编译器错误),同时添加关键字以明确“不关心”,例如override_ignore(不是我认为人们会想忽略这个)?
答案 0 :(得分:2)
正如Nathan Oliver所说:向后兼容性(必要的邪恶)。虽然在术语“覆盖”上进行大规模替换相当容易。在代码库中,它只会成为已经不情愿的编程社区的另一个障碍。
另一个要点是代码可读性。如果您正在努力维护一个非常大的代码库的一小部分,那么更好可以在您的子类中使用覆盖说明符来提醒您:
C ++并不专注于使代码本身尽可能小而有效 - 这就是为什么它很少能够赢得任何代码高尔夫挑战的原因。相反,它是一种专注于严谨的语言,并且在您所做的每件事情中都是明确的。至少,这是我对语言的看法,以及为什么(虽然一些常见的操作需要更多的时间来写出来而不是许多其他语言)当我需要在复杂的程序中清晰时,它是我的首选语言
答案 1 :(得分:2)
还要考虑以下情况:
struct A {
virtual void foo();
}
struct B: public A {
vitual void fog() override;
}
您错误输入了 name 这个函数,这段代码会给您编译错误。但是,使用默认覆盖方法,编译器永远不会知道存在错误。