1. h--------------------------
  2. #ifndef VIRTUALFUNCTION_H
  3. #define VIRTUALFUNCTION_H
  4. /*
  5. * 派生类中覆盖虚函数的使用知识点
  6. * 1、返回值必须相同。 一个特例,返回值为本类类型的引用或指针,且可转为基类类型。
  7. * 参见:
  8. * virtual virtualFunction * own()
  9. * double defaultChange() override
  10. * float defaultChange() override
  11. *
  12. * 2、参数类型必须相同,参数个数必须相同,参数类型的顺序必须相同。
  13. * 参见:
  14. * void param(double, float, int) override
  15. * void param(int, double, float) override
  16. *
  17. * 3、虚函数带有默认实参。
  18. * a)基类指针或引用指向派生类对象,调用含有默认参数的虚函数时,在编译时静态绑定基类默认的实参值,而不是派生类的实参值。
  19. * 此情况将与预期不符合,值得注意。
  20. * 参见:
  21. * virtual void defaultParam(int a = 10)
  22. * void defaultParam(int a = 20) override
  23. * pvf->defaultParam()
  24. * b)派生类指针或引用,调用含有默认参数的虚函数时,也是编译时静态绑定基类默认的实参值,但绑定的是派生类的实参值。
  25. * 参见:
  26. * virtual void defaultParam(int a = 10)
  27. * void defaultParam(int a = 20) override
  28. * ppf->defaultParam()
  29. *
  30. * 4、回避虚函数,或者说,用指向派生类对象的基类指针或引用去调用基类版本的虚函数
  31. * 参见:
  32. * pvf->virtualFunction::own()
  33. *
  34. * ,或者说,在派生类中调用基类版本的虚函数
  35. * 参见:
  36. * void parentFunction::dieCircle()
  37. *
  38. * ,或者说,用派生类对象调用基类版本的虚函数
  39. * 参见:
  40. * ppf->virtualFunction::own()
  41. *
  42. * 5、C++11新增关键字override,在派生类中标识虚函数被覆盖。
  43. * a)override可加可不加,添加override编译器可以帮我们检查重写的函数返回值和参数是否符合规则,不符合规则会报错。
  44. * b)若不加override,把返回值或参数类型和顺序写错了,便不是覆盖,而是函数重载
  45. * 参见:
  46. * double defaultChange() override
  47. *
  48. * 6、C++11新增关键字final。final可修饰类和成员函数。
  49. * a)被final修饰的类不可以用于派生基类。
  50. * b)被final修饰的成员函数不可以在派生类中被覆盖。
  51. * 参见:
  52. * void finalVirtualFunc() override
  53. * class parentClass: public finalClass
  54. */
  55.  
  56. class virtualFunction
  57. {
  58. public:
  59. virtualFunction();
  60. virtual virtualFunction * own();
  61. virtual float defaultChange();
  62. virtual void param(int, double, float);
  63. virtual void defaultParam(int a = );
  64. virtual void dieCircle();
  65. virtual void finalVirtualFunc() final;
  66. };
  67.  
  68. class parentFunction: public virtualFunction
  69. {
  70. public:
  71. parentFunction * own() override; //正确
  72.  
  73. //double defaultChange() override; //报错 conflicting return type
  74. float defaultChange() override; //正确
  75.  
  76. //void param(double, float, int) override; //报错 maked override, but does not override
  77. void param(int, double, float) override; //正确
  78.  
  79. void defaultParam(int a = ) override;
  80. void dieCircle() override;
  81.  
  82. // void finalVirtualFunc() override; //错误 error overriding final function
  83. };
  84.  
  85. class finalClass final
  86. {};
  87.  
  88. //class parentClass: public finalClass //错误:cannot derive from 'final' base 'finalCalss' in derived type 'parentClass'
  89. //{};
  90.  
  91. #endif // VIRTUALFUNCTION_H
  92.  
  93. main-----------------------
  94. #include "virtualfunction.h"
  95. #include "finalfix.h"
  96.  
  97. int main(void)
  98. {
  99. virtualFunction *pvf;
  100. parentFunction *ppf;
  101. pvf = new parentFunction();
  102. ppf = new parentFunction();
  103.  
  104. pvf->own();
  105. pvf->virtualFunction::own();
  106. ppf->virtualFunction::own();
  107.  
  108. pvf->defaultChange();
  109.  
  110. pvf->param(,,);
  111. pvf->defaultParam();
  112. ppf->defaultParam();
  113.  
  114. pvf->dieCircle();
  115. // system("pause");
  116. return ;
  117. }
  118.  
  119. 打印输出---------------
  120. i am parentFunction father...
  121. i am virualFunction son...
  122. i am virualFunction son...
  123. i am father float...
  124. i am father, my param order is int - double - float...
  125. i am father, my default param value is ...
  126. i am father, my default param value is ...
  127. i am son circle...
  128. i am father circle...
  129.  
  130. cpp-------------------
  131. #include "virtualfunction.h"
  132. #include <QDebug>
  133. virtualFunction::virtualFunction()
  134. {
  135.  
  136. }
  137.  
  138. virtualFunction *virtualFunction::own()
  139. {
  140. qDebug()<<"i am virualFunction son...";
  141. }
  142.  
  143. float virtualFunction::defaultChange()
  144. {
  145. qDebug()<<"i am son float...";
  146. }
  147.  
  148. void virtualFunction::param(int, double, float)
  149. {
  150. qDebug()<<"i am son , my param order is int - double - float...";
  151. }
  152.  
  153. void virtualFunction::defaultParam(int a)
  154. {
  155. qDebug()<<"i am son, my default param value is "<<a<<"...";
  156. }
  157.  
  158. void virtualFunction::dieCircle()
  159. {
  160. qDebug()<<"i am son circle...";
  161. }
  162.  
  163. void virtualFunction::finalVirtualFunc()
  164. {
  165. qDebug()<<"i am son final function, i can't be override...";
  166. }
  167.  
  168. parentFunction *parentFunction::own()
  169. {
  170. qDebug()<<"i am parentFunction father...";
  171. }
  172.  
  173. void parentFunction::param(int, double, float)
  174. {
  175. qDebug()<<"i am father, my param order is int - double - float...";
  176. }
  177.  
  178. void parentFunction::defaultParam(int a)
  179. {
  180. qDebug()<<"i am father, my default param value is "<<a<<"...";
  181. }
  182.  
  183. void parentFunction::dieCircle()
  184. {
  185. // dieCircle(); //错误,自己调用自己是死循环
  186. virtualFunction::dieCircle();
  187. qDebug()<<"i am father circle...";
  188. }
  189.  
  190. //void parentFunction::param(double, float, int)
  191. //{
  192. // qDebug()<<"i am father, my param order is double - float - int...";
  193. //}
  194.  
  195. float parentFunction::defaultChange()
  196. {
  197. qDebug()<<"i am father float...";
  198. }

C++ 重写虚函数的代码使用注意点+全部知识点+全部例子实现的更多相关文章

  1. Qt如何重写虚函数

    eg:QWidget的有个虚函数,KeyPressEvent,当它的子类获得焦点的时候,如果有任何按键按下,就会触发这个虚函数. 1.在mainwindow.h中声明此虚函数 protected:vo ...

  2. c# 基础(重写与覆盖:接口与抽象,虚函数与抽象函数)

    总结 1:不管是重写还是覆盖都不会影响父类自身的功能(废话,肯定的嘛,除非代码被改). 2:当用子类创建父类的时候,如 C1 c3 = new C2(),重写会改变父类的功能,即调用子类的功能:而覆盖 ...

  3. 匹夫细说C#:从园友留言到动手实现C#虚函数机制

    前言 上一篇文章匹夫通过CIL代码简析了一下C#函数调用的话题.虽然点击进来的童鞋并不如匹夫预料的那么多,但也还是有一些挺有质量的来自园友的回复.这不,就有一个园友提出了这样一个代码,这段代码如果被编 ...

  4. 你好,C++(37)上车的人请买票!6.3.3 用虚函数实现多态

    6.3.3  用虚函数实现多态 在理解了面向对象的继承机制之后,我们知道了在大多数情况下派生类是基类的“一种”,就像“学生”是“人”类中的一种一样.既然“学生”是“人”的一种,那么在使用“人”这个概念 ...

  5. 【足迹C++primer】52、,转换和继承虚函数

    转换和继承,虚函数 Understanding conversions between base and derived classes is essential to understanding h ...

  6. C#语法-虚方法详解 Virtual 虚函数

    虚方法 / Virtual 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...

  7. mfc 纯虚函数和抽象类

    纯虚函数 抽像类 一.纯虚函数 虚函数为了重载和多态的需要,有时需要在基类中定义一个纯虚函数,代码部分在子类中加以实现.定义格式如下的函数我们称为纯虚函数: ; 纯虚函数与空虚函数是有区别的; 二.抽 ...

  8. C++虚函数与多态

    C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写.(这里我觉得要补充,重写的话可以有两种,直接重写成员函数和重写虚函 ...

  9. C++基础 (6) 第六天 继承 虚函数 虚继承 多态 虚函数

    继承是一种耦合度很强的关系 和父类代码很多都重复的 2 继承的概念 3 继承的概念和推演 语法: class 派生类:访问修饰符 基类 代码: … … 4 继承方式与访问控制权限 相对的说法: 爹派生 ...

随机推荐

  1. Java学习:常用函数接口

    常用函数接口 什么是函数式接口? 函数式接口,@FunctionalInterface,简称FI,简单的说,FI就是指仅含有一个抽象方法的接口,以@Functionalnterface标注 注意:这里 ...

  2. 1-Consul系列文章

    使用Consul做服务发现的若干姿势 Consul的反熵 [Consul]Consul架构-简介

  3. 设计模式之(十三)外观模式(Facade)

    外观模式思想 历史上牛人中成功逆袭,实现人生辉煌的人很多,这群人最耀眼的无疑是明太祖朱元璋,从一个放牛讨饭的最低层小屌丝逆袭到人类权力顶峰开国皇帝,确实是我等膜拜的对象.在发不断的发展过程中,其实就在 ...

  4. Python数据分析工具:Pandas之Series

    Python数据分析工具:Pandas之Series Pandas概述Pandas是Python的一个数据分析包,该工具为解决数据分析任务而创建.Pandas纳入大量库和标准数据模型,提供高效的操作数 ...

  5. APS中生产计划排程模块的基本原理

    高级计划系统(APS)作为ERP和MES的补充,用于协调物流.开发瓶颈资源和保证交货日期. APS包括需求和供应计划.运输和生产计划排程等各种供应链计划模块,本文主要介绍APS中生产计划排程模块的基本 ...

  6. Java中 / 和 %

    Java中 / 和 % 每天积累一些 Java 的知识点,补充自己的不足. 今天在刷面试题的碰到 % ,一下子还真想不起来这个运算符的作用,赶紧重温一下,这里我写了个小代码来体现 / 和 % 的区别. ...

  7. Django rest framework ---- 权限

    Django rest framework ---- 权限 添加权限 api/utils文件夹下新建premission.py文件,代码如下: message是当没有权限时,提示的信息 # FileN ...

  8. SSIS-WMI监视文件夹

    在文档交互数据时,通常会排个job每隔几分钟执行来解析文档,但是jOb不能排的太频繁了,所以文档不能及时的被解析. 在SSIS中可以使用WMI这个组件来监视文件夹,一旦有新文档丢入就马上执行解析程序, ...

  9. JS数据打印的几种方式

    /** * 在页面输出内容! */ document.write("This's Great!"); /** * 控制台打印: */ console.log("This ...

  10. 面向对象(五)--isinstance与issubclass方法、反射、内置方法(部分)、异常处理

    一.isinstance与issubclass方法 1.isinstance是用来判断对象是否是某个类 isinstance(obj,class) 2.issubclass是用来判断一个类是否为另一个 ...