我知道引入了override
contextual关键字来编写更安全的代码(通过检查具有相同签名的virtual
函数)但我感觉不太好,因为它似乎每次我想覆盖override
函数时,我都要写virtual
多余。
在99%的案例中不使用override
上下文关键字是不好的做法?为什么/什么时候我必须使用它(当我们错误地隐藏虚函数时,编译器警告是不够的)?
override
上下文关键字的优点是什么,而如果我们在C ++ 03中错误地隐藏虚函数(不使用override
上下文关键字),我们总是有编译器警告?
答案 0 :(得分:9)
override
关键字完全有用,我建议一直使用 。
如果拼错您的虚拟函数,它将编译正常,但在运行时程序将调用错误的函数。它将调用基类函数而不是覆盖。
这可能是一个非常难以找到的错误:
#include <iostream>
class Base
{
public:
virtual ~Base() {}
virtual int func()
{
// do stuff for bases
return 3;
}
};
class Derived
: public Base
{
public:
virtual int finc() // WHOOPS MISSPELLED, override would prevent this
{
// do stuff for deriveds
return 8;
}
};
int main()
{
Base* base = new Derived;
std::cout << base->func() << std::endl;
delete base;
}
答案 1 :(得分:3)
Annotations
就是你所谓的上下文关键字,它们用作澄清,以确保读取代码的任何人都意识到它是一个覆盖超类或接口中的函数的函数。
如果删除了最初被覆盖的功能,编译器也会发出警告,在这种情况下,您可能还想考虑删除您的功能。
据我所知,如果你省略anotations,没有什么不好的事情发生。这既不对也不错。就像你刚才说的那样:注释被引入来编写更安全的代码。 但是:他们不会以任何功能方式更改您的代码。
如果您在自己的项目中作为单个程序员工作,那么使用它们可能无关紧要。然而,坚持一种风格是好的做法(即你使用它,或者你不使用它。中间的任何东西,比如有时使用它,有时不仅会造成混乱)
如果你在团队中工作,你应该与你的队友讨论这个话题,并决定你是否使用它。
答案 2 :(得分:1)
在C ++ 11中使用覆盖上下文关键字有什么好处,而如果我们错误地隐藏虚函数,我们总是有编译器警告
几乎没有!?
但: 这取决于您的构建规则将接受多少警告。如果你说,每个警告都必须修复,你将得到相同的结果直到您使用编译器给你警告。
我们决定始终使用覆盖并删除虚拟覆盖方法。所以&#34;开销&#34;为零,代码是可移植的&#34;给出错误&#34;滥用。
我个人喜欢这个新功能,因为它使语言更清晰。如果你说这是一个覆盖,它将被检查! 如果我们想添加一个具有不同签名的新方法,我们就不会得到误报警,这对您的方案很重要!