C++11 我应该始终使用覆盖上下文关键字吗?

C++11 我应该始终使用覆盖上下文关键字吗?,c++11,virtual-functions,overriding,C++11,Virtual Functions,Overriding,我知道引入了override上下文关键字来编写更安全的代码(通过检查具有相同签名的virtual函数),但我对此感觉不太好,因为每当我想重写virtual函数时,编写override似乎是多余的 在99%的情况下不使用覆盖上下文关键字是否是一种不好的做法?为什么/何时必须使用它(当我们错误地隐藏虚拟函数时,编译器警告是不够的) 编辑:换句话说;在C++11中使用override上下文关键字的好处是什么?如果我们在C++03中错误地隐藏了一个虚拟函数(而没有使用override上下文关键字),我们

我知道引入了
override
上下文关键字来编写更安全的代码(通过检查具有相同签名的
virtual
函数),但我对此感觉不太好,因为每当我想重写
virtual
函数时,编写
override
似乎是多余的

在99%的情况下不使用
覆盖
上下文关键字是否是一种不好的做法?为什么/何时必须使用它(当我们错误地隐藏虚拟函数时,编译器警告是不够的)


编辑:换句话说;在C++11中使用
override
上下文关键字的好处是什么?如果我们在C++03中错误地隐藏了一个虚拟函数(而没有使用
override
上下文关键字),我们总是会收到编译器警告。

注释
就是您所说的上下文关键字,它们起到澄清的作用,确保任何阅读代码的人都意识到它是重写超类或接口中函数的函数。

如果删除了最初重写的功能,编译器也会发出警告,在这种情况下,您可能还需要考虑删除函数

据我所知,如果你接受捐赠,没有什么坏事发生。这既不对也不对。正如您已经正确指出的:引入注释是为了编写更安全的代码。 但是:他们不会以任何功能方式更改您的代码

如果您在自己的项目中作为一名程序员工作,那么您是否使用它们可能无关紧要。然而,坚持一种风格是一种很好的做法(即要么你使用它,要么你不使用它。任何介于两者之间的东西,比如有时使用它,有时不仅会引起混乱)

如果你在一个团队中工作,你应该和你的队友讨论这个话题,并决定是否使用它

在C++11中使用override上下文关键字的好处是什么?如果我们错误地隐藏了一个虚拟函数,我们总是会收到编译器警告

几乎没有

但是: 这取决于生成规则将接受多少警告。如果你说,每个警告都必须被修复,那么你将得到相同的结果,直到你使用一个给你警告的编译器

我们已决定始终使用覆盖和删除覆盖方法上的虚拟对象。因此“开销”为零,代码是可移植的,即误用时的“给出错误”


我个人喜欢这个新功能,因为它使语言更清晰。如果你说这是一个覆盖,它将被检查如果我们想添加一个具有不同签名的新方法,我们将不会得到误报警告,这在您的场景中非常重要

override
关键字非常有用,我建议您一直使用它

如果您拼错了虚拟函数,它可以正常编译,但在运行时程序将调用错误的函数。它将调用基类函数,而不是重写

这可能是一个很难找到的bug:

#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;
}
#包括
阶级基础
{
公众:
虚拟~Base(){}
虚int func()
{
//为基地做事
返回3;
}
};
类派生
:公共基地
{
公众:
virtual int finc()//哎呀,拼写错误,重写会阻止这种情况发生
{
//为被嘲笑的人做事
返回8;
}
};
int main()
{
Base*Base=新导出的;

STD::cOutToFror()你能解释为什么你认为它是多余的吗?我需要指出我发现了C++标签(和关于C++的编辑)在我发布我的答案后,我首先认为这一切都是关于Java的。然而,在我看来,注释的概念对于两种语言都是一样的。所以这不重要。但可能有人想确认我的答案或在必要时进行编辑。“如果删除了最初覆盖的功能,编译器也可以发出警告”但是,在C++中,编译器是错误的。BTW你是对的,使用<代码>覆盖> <代码>关键字会增加代码可读性,但我很奇怪为什么C++社区只添加可读性关键字??- PWe发明了C C++等,因为读/写机器代码(零点和一个)编程语言的发明有一个目的:使编程更容易(更可读)每一种编程语言对实现这一点都有不同的概念。=)顺便说一句,计算科学家有10%的时间创建新代码,20%的时间修改现有代码,最后70%的时间他试图弄清楚现有代码的实际用途。因此,是的,可读性确实会在90%的情况。还请注意,省略现在冗余的
virtual
,即
int finc()覆盖