c++11 继承控制:final和override

  1. #define _CRT_SECURE_NO_WARNINGS
  2.  
  3. #include <iostream>
  4. #include <string>
  5. #include <vector>
  6. #include <map>
  7.  
  8. // C++11之前,一直没有继承控制关键字,禁用一个类的进一步衍生比较麻烦。
  9. /*
  10. C++ 11添加了两个继承控制关键字:final和override。
  11. final阻止类的进一步派生和虚函数的进一步重写
  12. override确保在派生类中声明的函数跟基类的虚函数有相同的签名
  13.  
  14. 在C++中,只要原来的返回类型是指向类的指针或引用,新的返回类型是指向派生类的指针或引用,覆盖的方法就可以改变返回类型。这样的类型称为协变返回类型(Covariant returns type).
  15. 返回类型的协变(covariance)指返回类型是接口或委托定义返回类型的子类,
  16. 参数类型的逆变(contravariance)是指实现的参数类型是接口或委托定义的参数类型的父类。
  17. */
  18. class B1 final {}; // 此类不能被继承
  19. //class D1: public B1 {}; // error!
  20.  
  21. class B
  22. {
  23. public:
  24. // virtual void func() override // error! 指定了重写但实际并没重写,没有基类
  25. // {
  26. // std::cout << __func__ << std::endl;
  27. // }
  28. virtual void f() const
  29. {
  30. std::cout << __func__ << std::endl;
  31. }
  32. virtual void fun()
  33. {
  34. std::cout << __func__ << std::endl;
  35. }
  36. };
  37.  
  38. class D : public B
  39. {
  40. public:
  41. virtual void f(int) // ok! 隐藏,由于没有重写同名函数B::f,在D中变为不可见
  42. {
  43. std::cout << "hiding: " <<__func__ << std::endl;
  44. }
  45. // virtual void f() override // error! 指定了重写但实际并没重写,类型声明不完全相同
  46. // {
  47. // std::cout << __func__ << std::endl;
  48. // }
  49. virtual void fun() override final // ok! 指定了重写实际上也重写了,同时,指定为最终,后代类中不能再重写此虚函数
  50. {
  51. std::cout << __func__ << std::endl;
  52. }
  53. };
  54.  
  55. class D2 : public D
  56. {
  57. public:
  58. virtual void f() const // ok! 重写B::f(),同时,由于没有重写D::f(int),在D2中变不可见
  59. {
  60. std::cout << __func__ << std::endl;
  61. }
  62. // virtual void fun() // error! 基类的此虚函数被指定为最终,不能被重写,虽然没有显示指定"override"
  63. // {
  64. // std::cout << __func__ << std::endl;
  65. // }
  66. // virtual void fun() override // error! 基类的此虚函数被指定为最终,不能被重写
  67. // {
  68. // std::cout << __func__ << std::endl;
  69. // }
  70. };
  71.  
  72. void mytest()
  73. {
  74.  
  75. return;
  76. }
  77.  
  78. int main()
  79. {
  80. mytest();
  81.  
  82. system("pause");
  83. return ;
  84. }

c++11 继承控制:final和override的更多相关文章

  1. C++ 11 Lambda表达式、auto、function、bind、final、override

    接触了cocos2dx 3.0,就必须得看C++ 11了.有分享过帖子:[转帖]漫话C++0x(四) —- function, bind和lambda.其实最后的Lambda没太怎么看懂. 看不懂没关 ...

  2. C++11: final与override

    C++11中增加了final与override关键字,貌似是从Java语言中借鉴而来,用途也一样.看例子代码: 01.#include <iostream> 02.  03.using n ...

  3. c++11 继承构造

    c++11 继承构造 #define _CRT_SECURE_NO_WARNINGS #include <iostream> #include <string> #includ ...

  4. 008单例、继承、final

    内容:单例,类继承,final #################################################################################### ...

  5. “全栈2019”Java第五十一章:继承与final关键字详解

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  6. Java(Android)编程思想笔记02:组合与继承、final、策略设计模式与适配器模式、内部类、序列化控制(注意事项)

    1.组合和继承之间的选择 组合和继承都允许在新的类中放置子对象,组合是显式的这样做,而继承则是隐式的做. 组合技术通常用于想在新类中使用现有类的功能而非它的接口这种情形.即在新类中嵌入某个对象,让其实 ...

  7. final ,override关键字

    final 有时我们会定义这样一种类,我们不希望其他类继承它,或者不想考虑它是否适合作为一个基类.为了实现这一目的,c++ 11新标准提供了一种防止继承发生的方法,即在类名后跟一个关键字final: ...

  8. 公有/私有/保护继承、overload/overwrite/override之间的区别

    一.继承 C++很重要的一个特征就是代码重用.在C语言中重用代码的方式就是拷贝代码.修改代码.C++可以用继承或组合的方式来重用.通过组合或继承现有的的类来创建新类,而不是重新创建它们. 继承是使用已 ...

  9. 从零开始学C++之继承(一):公有/私有/保护继承、overload/overwrite/override之间的区别

    一.继承 C++很重要的一个特征就是代码重用.在C语言中重用代码的方式就是拷贝代码.修改代码.C++可以用继承或组合的方式来重用.通过组合或继承现有的的类来创建新类,而不是重新创建它们. 继承是使用已 ...

随机推荐

  1. 初学者浅度剖析eShopOnContainers 里面用到的MediatR .

    一.介绍 简单了解下开源项目 MedatR, eShopOnContainers, MediatR作者Jimmy Bogard : Simple mediator implementation in ...

  2. python002

    1.万恶的”+“号字符串拼接 字符串中的连接符+”会开辟一个新的空间,多一个“+“就会多开辟一个空间,影响性能 2.字符串格式化 ”%S“   :字符类型         ”%D“   ”数字类型  ...

  3. Mysql优化之索引

    前言 这几天抽了个时间将<高性能Mysql>看了一下忽觉索引非常之重要,习之然后总结巩固知识.本文索引使用的是InnoDB存储引擎.因为本文并不是说用索引的好处,所以并不会书写QPS之类的 ...

  4. implode函数的升级版,将一个多维数组的值转化为字符串

    /** * implode函数的升级版 * 将一个多维数组的值转化为字符串 * @param $glue * @param $data * @return string */function mult ...

  5. Spring Cloud(二):服务注册与发现 Eureka【Finchley 版】

    Spring Cloud(二):服务注册与发现 Eureka[Finchley 版]  发表于 2018-04-15 |  更新于 2018-05-07 |  上一篇主要介绍了相关理论,这一篇开始我们 ...

  6. django(新增model)No migrations to apply.

    django 1.8版本,在models下新建一个class,无法在数据库创建新表的问题: - models.py class HostPwd(models.Model): hostname = mo ...

  7. React Native移动开发实战-4-Android平台的适配原理

    打开Android开发工具Android Studio,选择菜单 Open an existing AndroidStudio project,打开ch04项目的android文件夹,如图5.8所示. ...

  8. [linux] /sbin/nologin的用户运行程序

    创建一个/sbin/nologin用户 [root@host101 ~]# useradd -s /sbin/nologin redis [root@host101 ~]# grep redis /e ...

  9. 转载---VisualStudioCode通过SSH远程编辑文件

    最近需要长期修改远端服务器上的代码,调试.vim操作又不是很6,想到了远程操作的办法,找到一篇好用的bolg,记录一下. 原文链接:https://blog.csdn.net/qq_38401919/ ...

  10. python实现将json数据以json格式写入txt文件

    json.dumps中indent参数是设置json缩进量的 举例: tmp = { "aaa" : "111", "bbb" : '222 ...