NEW IN C++ 11
2013-12-16 15:10
399 查看
source::http://www.devbean.net/2012/05/cpp11-override-final/
参考文章:https://blogs.oracle.com/pcarlini/entry/c_11_tidbits_explicit_overrides
2012 年 3 月 22 日,GCC 4.7.0 正式发布。从这个版本开始,GCC 增加了许多新的 C++ 11 的特性。今天我们要介绍的是其中的一个特性:显式的使用
上面的代码是错误的,因为 D1 试图继承 B1,而 B1 则声明为 final。很像 Java,不是吗?当然!还有另外的用法:
这段代码又会出错,因为
final 的!
下面再看另外一段代码:
开发 D3 的程序员真的想重写
多亏了
值得注意的是,这些并不是一些语法糖,而是能确确实实地避免很多程序错误,并且暗示编译器可以作出一些优化。调用标记了
C++ 前端会识别出,这个函数不能被覆盖,因此会将其从类的虚表中删除。而标记为
参考文章:https://blogs.oracle.com/pcarlini/entry/c_11_tidbits_explicit_overrides
2012 年 3 月 22 日,GCC 4.7.0 正式发布。从这个版本开始,GCC 增加了许多新的 C++ 11 的特性。今天我们要介绍的是其中的一个特性:显式的使用
final和
override关键字。先来看下面的例子:
123 | struct B1 final { }; struct D1 : B1 { }; // 错误!不能从 final 类继承! |
1 2 3 4 5 6 7 8 9 | structB2 { virtualvoidf()final{}// final 函数 }; structD2:B2 { virtualvoidf(){} }; |
D2::f重写了
B2::f,但是
B2::f却被声明为
final 的!
下面再看另外一段代码:
123456789 | struct B3{ virtual void f() {}}; struct D3 : B3{ void f() {}}; |
B3::f函数吗?还是说,他只是不小心写了个与父类同名的函数,却在不经意间导致了覆盖?为了避免这种错误,C++ 11 引入了
override关键字(多么像 C# 啊!)。于是,我们会发现,下面的一段代码是会出错的:
1 2 3 4 5 6 7 8 9 10 | structB4 { virtualvoidg(int){} }; structD4:B4 { virtualvoidg(int)override{}// OK virtualvoidg(double)override{}// Error }; |
override关键字,我们可以让编译器帮我们检测到这个很难发现的程序错误。这段代码的错误在于,
override关键字表明,
g(double)虽然想要进行
override的操作,但实际父类并没有这么个函数。
值得注意的是,这些并不是一些语法糖,而是能确确实实地避免很多程序错误,并且暗示编译器可以作出一些优化。调用标记了
final的
virtual函数,例如上面的
B2::f,GNU
C++ 前端会识别出,这个函数不能被覆盖,因此会将其从类的虚表中删除。而标记为
final的类,例如上面的 B1,编译器则根本不会生成虚表。这样的代码显然更有效率。
相关文章推荐
- New in the Flash Player 11 (Incubator) API
- Effective C++ Item 10,11 Have assignment operators return a reference to *this Handle assignment to self in operator =
- Thinking in C++ (1-11) 小结
- C++ 11: lexical closure in lambda function, example 1
- 【ThinkingInC++】64、重载new和delete,来模仿内存的分配
- type dedution and reference collapse in c++ 11(works vc++ 2013)
- a new Webcam Api Tutorial in C++ for Windows(Windows Media Foundation)--WMF
- C++ AMP: Changes in VS 11 Beta for C++ AMP
- 【ThinkingInC++】11、外部变量
- 11 关于C++中的new和delete
- What's New in Delphi and C++Builder XE7
- 【ThinkingInC++】64、重载new和delete,来模仿内存的分配
- Creating a Security Descriptor for a New Object in C++
- C++11 Features in Visual C++ 11
- malloc/free and new/delete in C++
- New features in Visual C++ 10 and MFC 10
- New Features and Enhancements in C++Builder XE5
- The differences between new(delete) and malloc(free) in c/c++
- delegate in c++ (new version)
- LoadRunner 11压测时碰到错误Error: missing newline in *:\*****\*.dat