C++11 关键字override和final
C++11之前,一直没有继承控制关键字。禁用一个类的进一步衍生是可能的但也很棘手。为避免用户在派生类中重载一个虚函数,你不得不向后考虑。
C++ 11添加了两个继承控制关键字:override(声明虚函数为重载虚函数)和final(禁止类继承、禁止重载虚函数)。
override关键字
一个派生类可以重载在基类中声明的成员函数,这是面向对象设计的基础。然而像重载一个函数这么简单的操作也会出错。关于重载虚函数的两个常见错误如下:
1 无意中重载
首先,我们来分析一下无意中重载的综合症。你可能只是通过声明了一个与基类的某个虚成员函数具有相同的名字和签名的成员函数而无意中重载了这个虚函数。编译器和读代码的人很难发现这个bug因为他们通常以为这个新函数是为了实现对基类函数的重载:
class A
{public:virtual void func();
}; class B: A{};class F{};class D: A, F
{public:void func(); // meant to declare a new function but accidentally overrides A::func
};
阅读以上代码,你不能确定成员函数D::func()是否故意重载了A::func().它也可能是个偶然发生的重载,因为两个函数的参数列表和名字都碰巧一样。
2 签名不匹配
签名不匹配是一个更为常见的情景。这导致意外创建一个新的虚函数(而不是重载一个已存在的虚函数),正如以下例子所示:
class G
{public:virtual void func(int);
};class H: G
{public:virtual void func(double);
};
这种情况下,程序员本打算在类H中重载G::func()的。然而,由于H::func()拥有不同的签名,结果创建了一个新的虚函数,而非对基类函数的重载:
H *p=new H;
p->func(5); //calls G::f
p->func(5.0); // calls H::f
碰到这种情况,不是所有的编译器都会给个警告,有时那样做会被设置成抑制这种警告。
基于上面的两个错误,在C++11中,通过使用新关键字override可以消除这两个bugs。override明确地表示一个函数是对基类中一个虚函数的重载。更重要的是,它会检查基类虚函数和派生类中重载函数的签名不匹配问题。如果签名不匹配,编译器会发出错误信息。
使用override
class G
{public:virtual void func(int);
};class H: G
{public:virtual void func(double) override; // compilation error
};
当处理到H::func()声明时,编译器会在一个基类查找与之匹配的虚函数。
final关键字
1 禁止类继承
程序员常常在没有意识到风险的情况下坚持从std::vector派生。在C++11中,无子类类型将被声明为如下所示:
class TaskManager {/*..*/} final;
class PrioritizedTaskManager: public TaskManager
{}; //compilation error: base class TaskManager is final
2 禁止重载虚函数
同样,你可以通过声明它为final来禁止一个虚函数被进一步重载。如果一个派生类试图重载一个final函数,编译器就会报错:
class A
{pulic:virtual void func() const;
};class B: A
{pulic:void func() const override final; // OK
};class C: B
{pulic:void func() const; // error, B::func is final
};
C::func()是否声明为override没关系,一旦一个虚函数被声明为final,派生类不能再重载它。
C++11 关键字override和final相关推荐
- @override报错_C++ 多态性:C++11:override 与 final(学习笔记:第8章 09)
C++11:override 与 final[1] override 多态行为的基础:基类声明虚函数,继承类声明一个函数覆盖该虚函数 覆盖要求: 函数签名(signature)完全一致 函数签名包括: ...
- C++11新特性探究:显式override和final
C++中,我们一般可以以基类声明纯虚函数,然后让派生类继承并重写这个虚函数,用override表示显示覆盖基类方法,但一直没有提供一种方法来阻止派生类继承基类的虚函数. C++11标准引入了fina ...
- override和final标识符
override和final标识符 override和final是C++引入的新的标识符.注意是标识符不是关键字. 标识符和关键字的区别 关键字(KEYWORD):也称保留字.它们为语言所用,不可用于 ...
- C++新特性探究(二):override、final
"改写"(override)和"重载"(overload)读起来很像,尽管这是两个毫不相干的概念. --<Effective Modern C++&g ...
- C++ ——一文读懂:关键字override
override在C++中它是覆盖了一个方法并且对其重写,从而达到不同的作用.在我们C++编程过程中,最熟悉的就是对接口方法的实现,在接口中一般只是对方法进行了声明,而我们在实现时,就需要实现接口声明 ...
- C++关键字override
一.什么是override override的翻译是覆盖.实际上它在C++中可以检测哪些虚函数没有被重写并报错 注:在派生类的成员函数中使用override时,如果基类中无此函数,或基类中的函数并不是 ...
- 第一篇:C++11关键字
C++11 关键字共73个. 新增关键字: alignas.alignof.char16_t.char32_t.constexpr.decltype. noexcept.nullptr.static_ ...
- Cpp 11 / override 和 final 区别
一.override 1.诞生原因 C++ 中,有时继承关系较复杂时,基类和派生类各自的虚函数较多,导致开发人员傻傻地分不清哪些是重写了基类的虚函数,哪些是本派生类特有的虚函数.为了解决上述问题,添加 ...
- C++11中override的使用
override是C++11中的一个继承控制关键字.override确保在派生类中声明的重载函数跟基类的虚函数有相同的声明. override明确地表示一个函数是对基类中一个虚函数的重载.更重要的是, ...
- override与final
C++11新特性: 在派生类中,重写(override)继承自基类成员函数的实现时,要满足如下条件: 基类中,成员函数声明为虚拟的(virtual) 基类和派生类中,成员函数的返回类型和异常规格必须兼 ...
最新文章
- android 学习随笔二十(多媒体编程 )
- D(X)=E(X^2)-E^2(X)
- 搜索引擎web spam类型及防治策略(version 0.9)
- NodeJS中resolve添加地址无效
- linq中let关键字学习
- 七、CSS 三大特性(完整详细解析)
- Qt工作笔记-Linux上字体问题,导致所有文字重叠在一起
- python 第四天
- java类转换异常,java.lang.ClassCastException: java.lang.Integer cannot be cast to java.lang.Long
- 容器技术Docker K8s 30 容器服务ACK基础与进阶-弹性伸缩
- 【转】周鸿祎:网络业的柔道搏击术
- Java swing 开发windows桌面应用:课堂点名程序
- 添加无线网连接服务器,单片机加WIFI模块,一直无法连接到TCP服务器麻烦大家看看...
- 将CF卡移动磁盘标识改为本地磁盘标识的软件
- linux笔记本触屏方向反了,[已解决]如何设置触摸板上下滚屏反转(像mac一样,和windows是反的)...
- CPGIS三十周年专访系列|陶闯主席
- 200佳优秀的精美网页欣赏网站推荐(系列八)
- SAP 特别总账标识和备选统驭科目
- 短信验证码常见漏洞总结
- js 正则解决密码必须包含数字+特殊字符+英文字母大小写