final/override控制
先来复习下C++虚函数的特性:①重载函数需要与父类中虚函数的签名相同;②子类中的重载函数是否有virtual标识不影响继承树。按照这些特性,有如下代码
1 #include <iostream> 2 using namespace std; 3 4 class MethObject { 5 6 public: 7 virtual double Arith()=0; 8 virtual void Print()=0; 9 }; 10 11 class Printable:public MethObject { 12 13 public: 14 double Arith()=0; 15 void Print(){ 16 cout << "Output is: " << Arith() << endl; 17 } 18 }; 19 20 class Add2:public Printable { 21 22 public: 23 Add2(double a, double b):x(a), y(b) {} 24 double Arith() {return x+y;} 25 26 private: 27 double x, y; 28 }; 29 30 class Mul3:public Printable { 31 32 public: 33 Mul3(double a, double b, double c):x(a), y(b), z(c) {} 34 double Arith() {return x*y*z;} 35 36 private: 37 double x, y, z; 38 };
现在我们为了保持统一的打印风格,从而禁止Printable的子类重载Print虚函数,这就要用到C++11中的final关键字,做过Java的都知道finally关键字,他们的特性类似。
稍微修改下代码,就可以看到编译错误:
1 #include <iostream> 2 using namespace std; 3 4 class MethObject { 5 6 public: 7 virtual double Arith()=0; 8 virtual void Print()=0; 9 }; 10 11 class Printable:public MethObject { 12 13 public: 14 double Arith()=0; 15 void Print() final{ 16 cout << "Output is: " << Arith() << endl; 17 } 18 }; 19 20 class Add2:public Printable { 21 22 public: 23 Add2(double a, double b):x(a), y(b) {} 24 double Arith() {return x+y;} 25 void Print() { 26 cout << "This is disallowed!" << endl; 27 } 28 29 private: 30 double x, y; 31 }; 32 33 class Mul3:public Printable { 34 35 public: 36 Mul3(double a, double b, double c):x(a), y(b), z(c) {} 37 double Arith() {return x*y*z;} 38 39 private: 40 double x, y, z; 41 };
编译结果如下:
从编译器提示的信息,就可以很清楚的看到错误内容。
C++虚函数的第二个特性,会导致一个“跨层”的问题,看如下代码:
1 class A { 2 virtual void Test() = 0; 3 }; 4 5 class B:public A { 6 }; 7 8 class C:public B { 9 void Test(){} 10 };
类C中的Test函数仍然是虚函数,但是类C的继承者却不一定知道Test函数是否可以重载,或者还有一种情况,类C的继承者原意是想重载Test函数,但是手抖了下,写成了test(),在编译器看来这是OK的,会产生Test()与test()两个函数,但是在实际运用中,就会出现一些不必要的错误。为了解决这个问题,就需要用到override关键字(类似Java的修饰符中的@override)
1 #include <iostream> 2 using namespace std; 3 4 class A { 5 virtual void Test() = 0; 6 void test(); 7 }; 8 9 class B:public A { 10 }; 11 12 class C:public B { 13 void Test() override {} 14 void test() override {} 15 };
编译结果如下:
提示信息很清晰,一眼就能看懂,就不做过多解释了。
转载于:https://www.cnblogs.com/lniwn/p/3403707.html
final/override控制相关推荐
- 《深入理解C++11:C++ 11新特性解析与应用》——导读
前 言 为什么要写这本书 相比其他语言的频繁更新,C++语言标准已经有十多年没有真正更新过了.而上一次标准制定,正是面向对象概念开始盛行的时候.较之基于过程的编程语言,基于面向对象.泛型编程等概念的C ...
- 深入理解C++11pdf
下载地址:网盘下载 内容简介 · · · · · · <深入理解C++11:C++11新特性解析与应用>内容简介:国内首本全面深入解读C++11新标准的专著,由C++标准委员会代表和IB ...
- oracle 函数 实现重载_C++函数重载的深入解析
<深入理解C++11:C++ 11新特性解析与应用>--2.10 final/override控制 2.10 final/override控制 类别:部分人 在了解C++11中的final ...
- C++11强类型枚举,override/final
C++11(一)开篇 这个系列主要介绍C++11的一些新的特性,C++11问世至今已经有将近十年了.但是许多公司仍然停留在C++98上.之前在部门分享过C++11的知识,在这里分享给有需要的人. C+ ...
- c++ override final关键字
final: 1.一个类或结构体不希望被继承 class Base final {};class Derive : public Base {}; 报错信息如下: 1.cpp:34:7: error: ...
- [转] Java中public,private,final,static等概念的解读
作为刚入门Java的小白,对于public,private,final,static等概念总是搞不清楚,到底都代表着什么,这里做一个简单的梳理,和大家分享,若有错误请指正,谢谢~ 访问权限修饰符 pu ...
- 《从零开始学Swift》学习笔记(Day 47)——final关键字
在类的定义中使用final关键字声明类.属性.方法和下标.final声明的类不能被继承,final声明的属性.方法和下标不能被重写. 下面看一个示例: 1 2 3 4 5 6 7 8 9 10 11 ...
- java 内嵌机制_[转] Java中public,private,final,static等概念的解读
作为刚入门Java的小白,对于public,private,final,static等概念总是搞不清楚,到底都代表着什么,这里做一个简单的梳理,和大家分享,若有错误请指正,谢谢~ 访问权限修饰符 pu ...
- C++11-列表初始化/变量类型推导/范围for/finaloverride/默认成员函数控制
C++11-列表初始化/变量类型推导/范围for/final&override/默认成员函数控制 零.前言 一.C++11简介 二.列表初始化 1.内置类型列表初始化 2.自定义类型列表初始化 ...
最新文章
- The j.u.c Synchronizer Framework翻译(三)使用、性能与总结
- js 为什么0.1+0.2不等于0.3
- SQLServer2008 Transact_SQL语言基础实例
- C++ OpenGL透明纹理源码
- 计算机房的英语用谐音怎么读,“人机对话”学英语 发音不准就过不了电脑关...
- 一步步编写操作系统80 扩展内联汇编1
- 建设工程项目全寿命周期管理是指_(必过)2020年二建机电《施工管理》考前必背精华知识点整理一...
- 【英语学习】【WOTD】inexorable 释义/词源/示例
- mysql5.6主从不报错_mysql5.6.26主从复制报错1050
- jqGrid Pager、Navigator和自定义按钮(转)
- 用 Open Live Writer 来写 cnblog.com 博客
- Struts2框架之文件下载
- 光大DVR模块串口通信协议开发总结
- 【python】断言的用法
- pr基本图形模板无法使用_PR基本图形的导入,使用图文教程
- WIN10系统盘安装提示MBR分区问题解决步骤
- php 极光定时推送消息,极光短信- 短信定时发送 API - 极光文档
- 在Linux系统中访问虚拟机的数据库和访问Windows(本机)下的数据库:
- QPushButton禁用状态文字变形变粗
- centos7 安装显卡驱动及cuda10.2
热门文章
- mysql命令:查看表结构
- php 多进程 消息队列,[PHP] 多进程通信-消息队列使用
- rust灯灭了怎么办_Rust Rc 方法整理
- qt tcp通信_Qt之网络编程TCP通信
- win7访问linux共享路径不存在,win7系统访问网络共享找不到网络路径如何解决
- 计算机配件制作表格,CAD教程 中望CAD表格功能创建零件明细表
- v 3437 powered by ipb_奔驰V系改装订制版 目前最安全的商务车_凤凰网汽车
- rockemq 发送延迟消息_RocketMQ系列(五)广播与延迟消息
- mysql 导出数据为csv格式
- Python3.9又更新了:dict内置新功能,正式版十月见面