先来复习下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控制相关推荐

  1. 《深入理解C++11:C++ 11新特性解析与应用》——导读

    前 言 为什么要写这本书 相比其他语言的频繁更新,C++语言标准已经有十多年没有真正更新过了.而上一次标准制定,正是面向对象概念开始盛行的时候.较之基于过程的编程语言,基于面向对象.泛型编程等概念的C ...

  2. 深入理解C++11pdf

    下载地址:网盘下载 内容简介  · · · · · · <深入理解C++11:C++11新特性解析与应用>内容简介:国内首本全面深入解读C++11新标准的专著,由C++标准委员会代表和IB ...

  3. oracle 函数 实现重载_C++函数重载的深入解析

    <深入理解C++11:C++ 11新特性解析与应用>--2.10 final/override控制 2.10 final/override控制 类别:部分人 在了解C++11中的final ...

  4. C++11强类型枚举,override/final

    C++11(一)开篇 这个系列主要介绍C++11的一些新的特性,C++11问世至今已经有将近十年了.但是许多公司仍然停留在C++98上.之前在部门分享过C++11的知识,在这里分享给有需要的人. C+ ...

  5. c++ override final关键字

    final: 1.一个类或结构体不希望被继承 class Base final {};class Derive : public Base {}; 报错信息如下: 1.cpp:34:7: error: ...

  6. [转] Java中public,private,final,static等概念的解读

    作为刚入门Java的小白,对于public,private,final,static等概念总是搞不清楚,到底都代表着什么,这里做一个简单的梳理,和大家分享,若有错误请指正,谢谢~ 访问权限修饰符 pu ...

  7. 《从零开始学Swift》学习笔记(Day 47)——final关键字

    在类的定义中使用final关键字声明类.属性.方法和下标.final声明的类不能被继承,final声明的属性.方法和下标不能被重写. 下面看一个示例: 1 2 3 4 5 6 7 8 9 10 11 ...

  8. java 内嵌机制_[转] Java中public,private,final,static等概念的解读

    作为刚入门Java的小白,对于public,private,final,static等概念总是搞不清楚,到底都代表着什么,这里做一个简单的梳理,和大家分享,若有错误请指正,谢谢~ 访问权限修饰符 pu ...

  9. C++11-列表初始化/变量类型推导/范围for/finaloverride/默认成员函数控制

    C++11-列表初始化/变量类型推导/范围for/final&override/默认成员函数控制 零.前言 一.C++11简介 二.列表初始化 1.内置类型列表初始化 2.自定义类型列表初始化 ...

最新文章

  1. The j.u.c Synchronizer Framework翻译(三)使用、性能与总结
  2. js 为什么0.1+0.2不等于0.3
  3. SQLServer2008 Transact_SQL语言基础实例
  4. C++ OpenGL透明纹理源码
  5. 计算机房的英语用谐音怎么读,“人机对话”学英语 发音不准就过不了电脑关...
  6. 一步步编写操作系统80 扩展内联汇编1
  7. 建设工程项目全寿命周期管理是指_(必过)2020年二建机电《施工管理》考前必背精华知识点整理一...
  8. 【英语学习】【WOTD】inexorable 释义/词源/示例
  9. mysql5.6主从不报错_mysql5.6.26主从复制报错1050
  10. jqGrid Pager、Navigator和自定义按钮(转)
  11. 用 Open Live Writer 来写 cnblog.com 博客
  12. Struts2框架之文件下载
  13. 光大DVR模块串口通信协议开发总结
  14. 【python】断言的用法
  15. pr基本图形模板无法使用_PR基本图形的导入,使用图文教程
  16. WIN10系统盘安装提示MBR分区问题解决步骤
  17. php 极光定时推送消息,极光短信- 短信定时发送 API - 极光文档
  18. 在Linux系统中访问虚拟机的数据库和访问Windows(本机)下的数据库:
  19. QPushButton禁用状态文字变形变粗
  20. centos7 安装显卡驱动及cuda10.2

热门文章

  1. mysql命令:查看表结构
  2. php 多进程 消息队列,[PHP] 多进程通信-消息队列使用
  3. rust灯灭了怎么办_Rust Rc 方法整理
  4. qt tcp通信_Qt之网络编程TCP通信
  5. win7访问linux共享路径不存在,win7系统访问网络共享找不到网络路径如何解决
  6. 计算机配件制作表格,CAD教程 中望CAD表格功能创建零件明细表
  7. v 3437 powered by ipb_奔驰V系改装订制版 目前最安全的商务车_凤凰网汽车
  8. rockemq 发送延迟消息_RocketMQ系列(五)广播与延迟消息
  9. mysql 导出数据为csv格式
  10. Python3.9又更新了:dict内置新功能,正式版十月见面