
---清明时节雨纷纷,路上行人欲断魂。借问酒家何处有?牧童遥指杏花村。
今天是一年一度的清明节,各大网站纷纷跟进号召,仿佛世界都变成了黑白的。在这个特殊的节日里我们谈谈和继承控制。
这两个关键字并不能提升程序性能也不会影响程序逻辑,他们存在的作用就是控制继承关系。
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{};
我建议在写程序的时候尽量在合适的地方用这两个关键字,这样就能在程序编译的时候就发现隐藏的错误。
下期预告:
下期聊一聊继承构造和委托构造
关注公众号获取更多信息:

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

被折叠的 条评论
为什么被折叠?



