C++ 重写虚函数的代码使用注意点+全部知识点+全部例子实现
h--------------------------
#ifndef VIRTUALFUNCTION_H
#define VIRTUALFUNCTION_H
/*
* 派生类中覆盖虚函数的使用知识点
* 1、返回值必须相同。 一个特例,返回值为本类类型的引用或指针,且可转为基类类型。
* 参见:
* virtual virtualFunction * own()
* double defaultChange() override
* float defaultChange() override
*
* 2、参数类型必须相同,参数个数必须相同,参数类型的顺序必须相同。
* 参见:
* void param(double, float, int) override
* void param(int, double, float) override
*
* 3、虚函数带有默认实参。
* a)基类指针或引用指向派生类对象,调用含有默认参数的虚函数时,在编译时静态绑定基类默认的实参值,而不是派生类的实参值。
* 此情况将与预期不符合,值得注意。
* 参见:
* virtual void defaultParam(int a = 10)
* void defaultParam(int a = 20) override
* pvf->defaultParam()
* b)派生类指针或引用,调用含有默认参数的虚函数时,也是编译时静态绑定基类默认的实参值,但绑定的是派生类的实参值。
* 参见:
* virtual void defaultParam(int a = 10)
* void defaultParam(int a = 20) override
* ppf->defaultParam()
*
* 4、回避虚函数,或者说,用指向派生类对象的基类指针或引用去调用基类版本的虚函数
* 参见:
* pvf->virtualFunction::own()
*
* ,或者说,在派生类中调用基类版本的虚函数
* 参见:
* void parentFunction::dieCircle()
*
* ,或者说,用派生类对象调用基类版本的虚函数
* 参见:
* ppf->virtualFunction::own()
*
* 5、C++11新增关键字override,在派生类中标识虚函数被覆盖。
* a)override可加可不加,添加override编译器可以帮我们检查重写的函数返回值和参数是否符合规则,不符合规则会报错。
* b)若不加override,把返回值或参数类型和顺序写错了,便不是覆盖,而是函数重载
* 参见:
* double defaultChange() override
*
* 6、C++11新增关键字final。final可修饰类和成员函数。
* a)被final修饰的类不可以用于派生基类。
* b)被final修饰的成员函数不可以在派生类中被覆盖。
* 参见:
* void finalVirtualFunc() override
* class parentClass: public finalClass
*/ class virtualFunction
{
public:
virtualFunction();
virtual virtualFunction * own();
virtual float defaultChange();
virtual void param(int, double, float);
virtual void defaultParam(int a = );
virtual void dieCircle();
virtual void finalVirtualFunc() final;
}; class parentFunction: public virtualFunction
{
public:
parentFunction * own() override; //正确 //double defaultChange() override; //报错 conflicting return type
float defaultChange() override; //正确 //void param(double, float, int) override; //报错 maked override, but does not override
void param(int, double, float) override; //正确 void defaultParam(int a = ) override;
void dieCircle() override; // void finalVirtualFunc() override; //错误 error overriding final function
}; class finalClass final
{}; //class parentClass: public finalClass //错误:cannot derive from 'final' base 'finalCalss' in derived type 'parentClass'
//{}; #endif // VIRTUALFUNCTION_H main-----------------------
#include "virtualfunction.h"
#include "finalfix.h" int main(void)
{
virtualFunction *pvf;
parentFunction *ppf;
pvf = new parentFunction();
ppf = new parentFunction(); pvf->own();
pvf->virtualFunction::own();
ppf->virtualFunction::own(); pvf->defaultChange(); pvf->param(,,);
pvf->defaultParam();
ppf->defaultParam(); pvf->dieCircle();
// system("pause");
return ;
} 打印输出---------------
i am parentFunction father...
i am virualFunction son...
i am virualFunction son...
i am father float...
i am father, my param order is int - double - float...
i am father, my default param value is ...
i am father, my default param value is ...
i am son circle...
i am father circle... cpp-------------------
#include "virtualfunction.h"
#include <QDebug>
virtualFunction::virtualFunction()
{ } virtualFunction *virtualFunction::own()
{
qDebug()<<"i am virualFunction son...";
} float virtualFunction::defaultChange()
{
qDebug()<<"i am son float...";
} void virtualFunction::param(int, double, float)
{
qDebug()<<"i am son , my param order is int - double - float...";
} void virtualFunction::defaultParam(int a)
{
qDebug()<<"i am son, my default param value is "<<a<<"...";
} void virtualFunction::dieCircle()
{
qDebug()<<"i am son circle...";
} void virtualFunction::finalVirtualFunc()
{
qDebug()<<"i am son final function, i can't be override...";
} parentFunction *parentFunction::own()
{
qDebug()<<"i am parentFunction father...";
} void parentFunction::param(int, double, float)
{
qDebug()<<"i am father, my param order is int - double - float...";
} void parentFunction::defaultParam(int a)
{
qDebug()<<"i am father, my default param value is "<<a<<"...";
} void parentFunction::dieCircle()
{
// dieCircle(); //错误,自己调用自己是死循环
virtualFunction::dieCircle();
qDebug()<<"i am father circle...";
} //void parentFunction::param(double, float, int)
//{
// qDebug()<<"i am father, my param order is double - float - int...";
//} float parentFunction::defaultChange()
{
qDebug()<<"i am father float...";
}
C++ 重写虚函数的代码使用注意点+全部知识点+全部例子实现的更多相关文章
- Qt如何重写虚函数
eg:QWidget的有个虚函数,KeyPressEvent,当它的子类获得焦点的时候,如果有任何按键按下,就会触发这个虚函数. 1.在mainwindow.h中声明此虚函数 protected:vo ...
- c# 基础(重写与覆盖:接口与抽象,虚函数与抽象函数)
总结 1:不管是重写还是覆盖都不会影响父类自身的功能(废话,肯定的嘛,除非代码被改). 2:当用子类创建父类的时候,如 C1 c3 = new C2(),重写会改变父类的功能,即调用子类的功能:而覆盖 ...
- 匹夫细说C#:从园友留言到动手实现C#虚函数机制
前言 上一篇文章匹夫通过CIL代码简析了一下C#函数调用的话题.虽然点击进来的童鞋并不如匹夫预料的那么多,但也还是有一些挺有质量的来自园友的回复.这不,就有一个园友提出了这样一个代码,这段代码如果被编 ...
- 你好,C++(37)上车的人请买票!6.3.3 用虚函数实现多态
6.3.3 用虚函数实现多态 在理解了面向对象的继承机制之后,我们知道了在大多数情况下派生类是基类的“一种”,就像“学生”是“人”类中的一种一样.既然“学生”是“人”的一种,那么在使用“人”这个概念 ...
- 【足迹C++primer】52、,转换和继承虚函数
转换和继承,虚函数 Understanding conversions between base and derived classes is essential to understanding h ...
- C#语法-虚方法详解 Virtual 虚函数
虚方法 / Virtual 本文提供全流程,中文翻译. Chinar 坚持将简单的生活方式,带给世人!(拥有更好的阅读体验 -- 高分辨率用户请根据需求调整网页缩放比例) Chinar -- 心分享. ...
- mfc 纯虚函数和抽象类
纯虚函数 抽像类 一.纯虚函数 虚函数为了重载和多态的需要,有时需要在基类中定义一个纯虚函数,代码部分在子类中加以实现.定义格式如下的函数我们称为纯虚函数: ; 纯虚函数与空虚函数是有区别的; 二.抽 ...
- C++虚函数与多态
C++多态性是通过虚函数来实现的,虚函数允许子类重新定义成员函数,而子类重新定义父类的做法称为覆盖(override),或者称为重写.(这里我觉得要补充,重写的话可以有两种,直接重写成员函数和重写虚函 ...
- C++基础 (6) 第六天 继承 虚函数 虚继承 多态 虚函数
继承是一种耦合度很强的关系 和父类代码很多都重复的 2 继承的概念 3 继承的概念和推演 语法: class 派生类:访问修饰符 基类 代码: … … 4 继承方式与访问控制权限 相对的说法: 爹派生 ...
随机推荐
- 【微信】微信小程序ISO上wx.scanCode BUG
================================================== BUG情况: 小程序在onLoad 主动调用wx.scanCode,安卓手机没有问题.iso调用失 ...
- netcore添加api帮助文档页-Swagger
1. 添加NuGet包 1)最基本的包:Swashbuckle.AspNetCore.Swagger 2)扩展包:Swashbuckle.AspNetCore.SwaggerGen和Swashbuck ...
- Git 版本及版本范围表示法
很多 Git 命令都使用 revision(修订版本)作为参数.根据不同的命令,有时候 revision 参 数代表一个特定的提交,有时候代表某一个提交可以追踪到的所有的父提交(比如 git log) ...
- PIESDKDoNet二次开发配置注意事项
在安装完PIESDK进行二次开发的过程中会遇到下面几种常见的开发配置问题,就写一个文档总结一下. 1. 新建项目无PIESDK模板问题 关于新建项目时候,找不到下图中的PIEMainApplic ...
- Ubuntu 16.4系统下安装docker
本文将介绍在ubuntu16.04系统下安装和升级docker.docker-compose.docker-machine. docker:有两个版本:docker-ce(社区版)和docker-ee ...
- 最新的JavaScript核心语言标准——ES6,彻底改变你编写JS代码的方式!
原文地址 迁移到:http://www.bdata-cap.com/newsinfo/1741515.html 本文内容 ECMAScript 发生了什么变化? 新标准 版本号6 兑现承诺 迭代器和f ...
- 【转载】C#的ArrayList使用IndexOf方法查找第一个符合条件的元素位置
在C#的编程开发中,ArrayList集合是一个常用的非泛型类集合,在ArrayList集合中如果需要查找第一个符合条件的元素所在的位置,可以使用ArrayList集合的IndexOf方法,Index ...
- MySQL基本库表管理
基本管理指令 mysql登陆 第一种 [root@wei ~]# mysql -u root -p 第二种(带参输入) [root@wei ~]# mysql -uroot -proot 注意:每个命 ...
- yum无法下载,网关问题
由于网关地址改变没有及时更新配置,造成无法下载 failure: repodata/repomd.xml from base: [Errno 256] No more mirrors to try h ...
- 10年前错过比特币,如今有斯坦福区块链项目pi币,对标btc,手机免费挖矿详细教程。
这一个斯坦福几个博士创业者做一个项目,目前还处于早期阶段,除了每天点一下挖矿之外,貌似不需要其他的操作,不需要耗费流量资源和手机大量的运算能力,就是一个安静的App而已....国内目前知道的人还不太多 ...