c++的override关键字什么意思

我那个编译器里把override标蓝(表示那是系统关键字),它有什么用?

我知道【英语单词】override表示子类覆盖掉父类的方法,调用时会调用子类的方法;父类对应的方法已经用virtual修饰。我问的是override作为c++【关键字】的用处。

是重载的意思,重载    了一个方法并且对其重写,以求达到不同的作用。

C++允许在同一范围中声明几个功能类似的同名函数,但是这些同名函数的形式参数(指参数的个数、类型或者顺序)必须不同,也就是说用同一个函数完成不同的功能。

覆盖就是对接口方法的实现,在接口中一般只是对方法进行了声明,而在实现时,就需要实现接口声明的所有方法。除了这个典型的用法以外,在继承中也可能会在子类覆盖父类中的方法。

当将要定义一组函数,使执行一系列的操作,但是它们是应用在不同的参数类型上的。此时可以选择重载函数。

例如: int z_x_max (int,int); //返回两个整数的最大值;

int ve_max (const vector <int> &); //返回vector容器中的最大值;

int matrix_max (const matrix &); //返回matrix引用的最大值;


扩展资料

在使用重载时只能通过不同的参数样式。例如,不同的参数类型,不同的参数个数,不同的参数顺序(同一方法内,参数类型参数类型不同的情况下才考虑参数顺序.比如fun(int a,int b)和fun(int b,int a)则是同样的方法,不能算作重载);

不能通过访问权限、返回类型、抛出的异常进行重载;方法的异常类型和数目不会对重载造成影响;对于继承来说,如果某一方法在父类中是访问权限是priavte,那么就不能在子类对其进行重载,如果定义的话,也只是定义了一个新方法,而不会达到重载的效果。

参考资料来源:百度百科-重载函数

参考资料来源:百度百科-override

温馨提示:答案为网友推荐,仅供参考
第1个回答  2019-11-29

override保留字表示当前函数重写了基类的虚函数

在函数比较多的情况下可以提示读者某个函数重写了基类虚函数,表示这个虚函数是从基类继承,不是派生类自己定义的;强制编译器检查某个函数是否重写基类虚函数,如果没有则报错。在类的成员函数参数列表后面添加该关键字既可。

override只是C++保留字,不是关键字,这意味着只有在正确的使用位置,oerride才启“关键字”的作用,其他地方可以作为标志符,如:intoverride;是合法的。

扩展资料

override的使用,示例:

classBase{

virtualvoidf();

};

classDerived:publicBase{

voidf()override;//表示派生类重写基类虚函数f

voidF()override;//错误:函数F没有重写基类任何虚函数

};

参考资料来源:百度百科—重载函数

参考资料来源:百度百科—override

本回答被网友采纳
第2个回答  推荐于2017-09-18
在C++11中为了帮助程序员写继承结构复杂的类型,引入了虚函数描述符override,如果派生类在虚函数声明时使用了override描述符,那么该函数必须重载其基类中的同名函数,否则代码将无法通过编译。我们来看一下如代码清单2-25所示的这个简单的例子。
代码清单2-25
struct Base {
virtual void Turing() = 0;
virtual void Dijkstra() = 0;
virtual void VNeumann(int g) = 0;
virtual void DKnuth() const;
void Print();
};
struct DerivedMid: public Base {
// void VNeumann(double g);
// 接口被隔离了,曾想多一个版本的VNeumann函数
};
struct DerivedTop : public DerivedMid {
void Turing() override;
void Dikjstra() override; // 无法通过编译,拼写错误,并非重载
void VNeumann(double g) override; // 无法通过编译,参数不一致,并非重载
void DKnuth() override; // 无法通过编译,常量性不一致,并非重载
void Print() override; // 无法通过编译,非虚函数重载
};
// 编译选项:g++ -c -std=c++11 2-10-3.cpp
在代码清单2-25中,我们在基类Base中定义了一些virtual的函数(接口)以及一个非virtual的函数Print。其派生类DerivedMid中,基类的Base的接口都没有重载,不过通过注释可以发现,DerivedMid的作者曾经想要重载出一个“void VNeumann(double g)”的版本。这行注释显然迷惑了编写DerivedTop的程序员,所以DerivedTop的作者在重载所有Base类的接口的时候,犯下了3种不同的错误:
函数名拼写错,Dijkstra误写作了Dikjstra。
函数原型不匹配,VNeumann函数的参数类型误做了double类型,而DKnuth的常量性在派生类中被取消了。
重写了非虚函数Print。
如果没有override修饰符,在代码清单2-25中,DerivedTop作者的4处可以编译过去 但是与他的愿意(想重载虚函数)有严重的偏差了 但是编译器不报错,继续编译下去 这样就难排查了。加上关键字override 这样编译器可以辅助检查是不是正确重载 。如果没有override修饰符 DerivedTop的作者可能在编译后都没有意识到自己犯了这么多错误。因为编译器对以上3种错误不会有任何的警示。这里override修饰符则可以保证编译器辅助地做一些检查。我们可以看到,在代码清单2-25中,DerivedTop作者的4处错误都无法通过编译。
此外,值得指出的是,在C++中,如果一个派生类的编写者自认为新写了一个接口,而实际上却重载了一个底层的接口(一些简单的名字如get、set、print就容易出现这样的状况),出现这种情况编译器还是爱莫能助的。不过这样无意中的重载一般不会带来太大的问题,因为派生类的变量如果调用了该接口,除了可能存在的一些虚函数开销外,仍然会执行派生类的版本。因此编译器也就没有必要提供检查“非重载”的状况。而检查“一定重载”的override关键字,对程序员的实际应用则会更有意义。
还有值得注意的是,如我们在第1章中提到的,final/override也可以定义为正常变量名,只有在其出现在函数后时才是能够控制继承/派生的关键字。通过这样的设计,很多含有final/override变量或者函数名的C++98代码就能够被C++编译器编译通过了。但出于安全考虑,建议读者在C++11代码中应该尽可能地避免这样的变量名称或将其定义在宏中,以防发生不必要的错误。
建议:如果派生类里面是像重载虚函数 就加上关键字override 这样编译器可以辅助检查是不是正确重载,如果没加这个关键字 也没什么严重的error 只是少了编译器检查的安全性
第3个回答  推荐于2017-09-13
描述:override保留字表示当前函数重写了基类的虚函数。

目的:1.在函数比较多的情况下可以提示读者某个函数重写了基类虚函数(表示这个虚函数是从基类继承,不是派生类自己定义的);2.强制编译器检查某个函数是否重写基类虚函数,如果没有则报错。

用法:在类的成员函数参数列表后面添加该关键字既可。

例子:
class Base {
virtual void f();
};

class Derived : public Base {
void f() override; // 表示派生类重写基类虚函数f
void F() override;//错误:函数F没有重写基类任何虚函数
};

注意:override只是C++保留字,不是关键字,这意味着只有在正确的使用位置,oerride才启“关键字”的作用,其他地方可以作为标志符(如:int override;是合法的)。

相关:override还有一个姊妹保留字final。

VC++编译器支持情况: VS2008,VS2010,VS2012,VS2013,+

注: override为标准C++保留字,并非VS特有,目前主流的编译器的新版本都支持该保留字。本回答被提问者采纳
第4个回答  2015-10-28

1、override关键字,可以让编译器检测到很难发现的程序错误。这个错误在于,override关键字表明,g(double)虽然想要进行override的操作,但实际父类并没有这么个函数。
值得注意的是,这些并不是一些语法糖,而是能确确实实地避免很多程序错误,并且暗示编译器可以作出一些优化。

2、例程:

struct B4
{
    virtual void g(int) {}
};
  
struct D4 : B4
{
    virtual void g(int) override {} // OK
    virtual void g(double) override {} // Error
};