【发布时间】:2017-01-15 04:11:03
【问题描述】:
背景
我刚刚偶然发现了override specifier 的一个用例,据我所知,这似乎是多余的,也没有任何特定的语义含义,但也许我遗漏了一些东西,因此提出了这个问题。在继续之前,我应该指出我已经尝试在 SO 上找到它的答案,但我得到的最接近的是以下线程,并没有真正回答我的查询(也许有人可以指出一个实际上已经回答了我的问答问题)。
问题
考虑以下抽象类:
struct Abstract {
virtual ~Abstract() {};
virtual void foo() = 0;
};
在直接从Abstract 派生的非抽象类中实现foo() 时,是否有任何理由使用override 说明符(如下面的DerivedB)?即,当派生类已经需要 foo() 的实现是非抽象的(并且没有真正覆盖任何东西)?
/* "common" derived class implementation, in my personal experience
(include virtual keyword for semantics) */
struct DerivedA : public Abstract {
virtual void foo() { std::cout << "A foo" << std::endl; }
};
/* is there any reason for having the override specifier here? */
struct DerivedB : public Abstract {
virtual void foo() override { std::cout << "B foo" << std::endl; }
};
【问题讨论】:
-
1) 它有助于确定派生的方法。 2)可能它可以帮助编译器进行一些优化它与java中的相同(@override)
-
这是一个不错的选择,以防您更改了基础中的签名但忘记更新派生。
-
从技术上讲,您在子类中也不需要
virtual,但您可以使用它。override更好,因为它更清楚地传达了意图。 -
@KrzysztofBargieł:“帮助”如何?编译器肯定知道该函数是一个覆盖。
override是为人类服务的。 -
@peppe 有理由实现覆盖。如果您更改基类中的签名(在非纯虚函数上),everythign 仍然可以编译,并且如果没有覆盖,您不会收到任何错误。
标签: c++