走进C++11(四)override/final

本文详细介绍了C++中的继承控制关键字override和final的作用及用法,并通过实例展示了如何使用这些关键字来提高代码质量和减少错误。

                      ---清明时节雨纷纷,路上行人欲断魂。借问酒家何处有?牧童遥指杏花村。

 

今天是一年一度的清明节,各大网站纷纷跟进号召,仿佛世界都变成了黑白的。在这个特殊的节日里我们谈谈和继承控制。

 

这两个关键字并不能提升程序性能也不会影响程序逻辑,他们存在的作用就是控制继承关系。

 

override

 

描述:override是C++11中的一个继承控制关键字。override确保在派生类中声明的重载函数跟基类的虚函数有相同的声明。

 

override明确地表示一个函数是对基类中一个虚函数的重载。更重要的是,它会检查基类虚函数和派生类中重载函数的签名不匹配问题。如果签名不匹配,编译器会发出错误信息。 

 

override表示函数应当重写基类中的虚函数(用于派生类的虚函数中) 。

 

目的:

 

  • 在函数比较多的情况下可以提示读者某个函数重写了基类虚函数(表示这个虚函数是从基类继承,不是派生类自己定义的);

  • 强制编译器检查某个函数是否重写基类虚函数,如果没有则报错。

 

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

 

下面举个小例子:

 

struct A{virtual void foo();void bar();};struct B : A{void foo() const override; // Error: B::foo does not override A::foo// (signature mismatch)void foo() override; // OK: B::foo overrides A::foovoid bar() override; // Error: A::bar is not virtual};

 

根据注释,我们可以很清晰的理解这个关键字的意思。有些人可能认为这个关键字没啥用。自己写程序的时候注意一下就好了,不必要用这个关键字。一开始我也是这么以为的,知道有一天我跌进了这个坑里。

 

故事是这样的。之前写过一个程序,大概是这样的:

 

struct A{virtual void foo();void fooo();};struct B : A{void foo(){...}//这个是之前别人写的void fooo(){...}//这个是我后加的};

 

当然当时的程序很复杂,我想调用foo然后从B中重写的foo。但是foo和fooo长的特别像我其实实现了fooo,结果调用foo,发现写的程序一直不生效。调试半天也无果。。。。后来发现是写错了,如果当时写上这个关键字,编译就会立马报错,不会花费大量时间debug。。。

 

final

 

final阻止类的进一步派生和虚函数的进一步重写。这个很简单,举个小例子就明白了:

 

struct Base{virtual void foo();};struct A : Base{void foo() final; // A::foo is overridden and it is the final overridevoid bar() final; // Error: non-virtual function cannot be overridden or be final};struct B final : A // struct B is final{void foo() override; // Error: foo cannot be overridden as it's final in A};struct C : B // Error: B is final{};

 

我建议在写程序的时候尽量在合适的地方用这两个关键字,这样就能在程序编译的时候就发现隐藏的错误。

 

下期预告:

 

下期聊一聊继承构造和委托构造

 

关注公众号获取更多信息:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值