final和override的用法
2015-07-03 14:30
246 查看
原文:C++11 新特性:显式 override 和 final
2012 年 3 月 22 日,GCC 4.7.0 正式发布。从这个版本开始,GCC 增加了许多新的 C++ 11 的特性。今天我们要介绍的是其中的一个特性:显式的使用 final和
override关键字。先来看下面的例子:
C++
123 | struct B1 final { }; struct D1 : B1 { }; // 错误!不能从 final 类继承! |
1 2 3 4 5 6 7 8 9 | struct B2 { virtual void f() final {} // final 函数 }; struct D2 : B2 { virtual void f() {} }; |
D2::f重写了
B2::f,但是
B2::f却被声明为
final 的!
下面再看另外一段代码:
C++
123456789 | struct B3{ virtual void f() {}}; struct D3 : B3{ void f() {}}; |
B3::f函数吗?还是说,他只是不小心写了个与父类同名的函数,却在不经意间导致了覆盖?为了避免这种错误,C++ 11 引入了
override关键字(多么像 C# 啊!)。于是,我们会发现,下面的一段代码是会出错的:C++
1 2 3 4 5 6 7 8 9 10 | struct B4 { virtual void g(int) {} }; struct D4 : B4 { virtual void g(int) override {} // OK virtual void g(double) override {} // Error }; |
override关键字,我们可以让编译器帮我们检测到这个很难发现的程序错误。这段代码的错误在于,
override关键字表明,
g(double)虽然想要进行
override的操作,但实际父类并没有这么个函数。
值得注意的是,这些并不是一些语法糖,而是能确确实实地避免很多程序错误,并且暗示编译器可以作出一些优化。调用标记了
final的
virtual函数,例如上面的
B2::f,GNU
C++ 前端会识别出,这个函数不能被覆盖,因此会将其从类的虚表中删除。而标记为
final的类,例如上面的 B1,编译器则根本不会生成虚表。这样的代码显然更有效率。
相关文章推荐
- 为什么浏览器User-agent总是有Mozilla字样——User-agent String里的历史故事
- 交换两个变量的值
- Leetcode 120 Triangle 三角形最小路径和
- Java 7 的7个新特性
- IOS开发之----四舍五入问题
- Fragment间回调传值
- freemarker list (长度,遍历,下标,嵌套,排序)
- js中join和split的用法
- linux gz 解压缩
- iOS键盘监控键盘
- linux grep命令详解
- 知道如何对付session劫持(session hijacking)
- centos 彻底卸载Mysql
- Xamarin for Mac 2.0.2.35 稳定版 破解补丁 Preview 2
- IOS开发-使用Storyboard进行界面跳转及传值
- GRE写作必备句型
- iOS 字符转换为16进制如@"139989"转成<139989>
- 怎样对平面中的点进行顺时针或者逆时针排序
- python3.4学习笔记(十五) 字符串操作(string替换、删除、截取、复制、连接、比较、查找、包含、大小写转换、分割等)
- Leetcode dfs Combination SumII