C++中的虚函数详解

2023-05-16

虚函数在运行时绑定,即运行时确定执行的函数。所谓的后期绑定就是一个基类中有一个虚函数,而派生类中重写了这个函数,那么调用的这个虚函数的时候根据类的实例的不同而调用不同的函数。

实例化是指在面向对象的编程中,把用类创建对象的过程称为实例化。是将一个抽象的概念类,具体到该类实物的过程。实例化过程中一般由类名 对象名 = new 类名(参数1,参数2...参数n)构成。C++中实例化一个类时返回的是新创建的指针,例如Parent *son = new Parent()。其中,类的实例化过程中可以不加入new,区别在于new实例化的对象,在堆上创建,使用完成后,必须delete。而没有使用new实例化的对象,在栈上创建,由内存自由释放。

为什么会有虚函数的存在?

c++发展至今,相信绝大多数类的场景都覆盖掉了。例如,在类的多态中,使用子类实例化对象调用子类的成员函数、使用父类对象调用父类的成员函数,使用子类对象继承类的成员函数,那么,有没有一种方式,可以使用父类的对象调用子类的成员函数呢?于是,虚函数就诞生了,可以让父类指针有多种形态。

用例验证,定义一个基类Father,两个子类Xiaoming与Xiaobai。其中,技能这一项,Father会游泳,Xiaoming会飞行,Xiaobai会喷火。然而对于找女朋友这一项,因为Father已经有妈妈了,所以只能声明为虚函数,交给子类来实现这个方法,Xiaoming想找个漂亮的,Xiaobai成绩不好,想找个学习好的辅导他。具体代码如下:

#include <iostream>

using namespace std;

class Father
{
public:
    Father()
    {
        cout << "im a father" << endl;
    }

    virtual void  Skill()
    {
        cout << "can swing" << endl;
    }

    virtual void AskForAGirlFriend() = 0;
};

class Xiaoming : public Father
{
public:
    Xiaoming()
    {
        cout << "im xiaoming" << endl;
    }

    void Skill()
    {
        cout << "can flight" << endl;     // 能飞行
    }

    void AskForAGirlFriend()
    {
        cout << "beautiful" << endl;
    }
};

class Xiaobai : public Father
{
public:
    Xiaobai()
    {
      cout << "im xiaobai" << endl;
    }

    void Skill()
    {
        cout << "can eruption" << endl; // 能喷火
    }

    void AskForAGirlFriend()
    {
        cout << "have a good grades" << endl;
    }
};

int main()
{
    Father *xiaoming = new Xiaoming();
    Father *xiaobai  = new Xiaobai();

    xiaoming->Skill();
    xiaobai ->Skill();

    xiaoming->AskForAGirlFriend();
    xiaobai ->AskForAGirlFriend();

    return 0;
}

输出如下:

im a father    // 使用子类实例化父类对象,优先输出父类的构造函数,再输出子类的构造函数
im xiaoming
im a father
im xiaobai
can flight    // Skill()为虚函数,故输出子类的方法,实现类的多态
can eruption
beautiful     // AskForAGirlFriend()为纯虚函数,故交由子类实现,且基类不可有默认项配置
have a good grades    

总结如下:

1.当基类的某个成员方法,在大多数情形下都应该由子类提供个性化实现,但基类也可以提供一个备选方案的时候,请将其设计为虚函数。例如基类和子类分别有不同的技能。
2.当基类的某个成员方法,必须由子类提供个性化实现的时候,请将其设计为纯虚函数。例如找女朋友这件事,每个人都有不同的标准,不应该统一化。
3.使用一个子类来实例化父类的指针或引用,进而调用经由子类复写的个性化的虚函数,这是C++实现多态性的一个最经典的场景。
4.基类提供的纯虚函数的实现版本,并非为了多态性考虑,因为指向子类对象的基类指针和引用无法调用该版本。纯虚函数在基类中的实现跟多态性无关,它只是提供了一种语法上的便利,在变化多端的应用场景中留有后路;
5.虚函数和普通的函数实际上是存储在不同的区域的,虚函数所在的区域是可被覆盖(也称复写override)的,每当子类定义相同名称的虚函数时就将原来基类的版本给覆盖了,另一侧面也说明了为什么基类中声明的虚函数在后代类中不需要另加声明一律自动为虚函数,因为它所存储的位置不会发生改变,虚函数表可以保证调用对应虚函数。而普通函数的存储区域不会覆盖,每个类都有自己独立的区域互不相干。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C++中的虚函数详解 的相关文章

  • 3D点云目标检测算法综述

    一 概述 在3D点云目标检测领域 xff0c 对于数据输入的处理一般有三种 xff1a 多视角 将三维点云投射到多个二维平面形成图像 体素 xff0c voxel xff0c 将三维点云切割成多个小块 xff0c 这些小块就叫体素 xff0
  • 稀疏卷积 Sparse Convolution Net

    概述 这是一篇对稀疏卷积讲述非常全面的文章 xff0c 理解起来毫不费事 这里要和SPConv相区别 xff0c 这是两个完全不同的东西 SPConv是为了解决普通3 3卷积算子参数冗余而设计的 xff0c 一种 即插即用 计算单元 xff
  • TensorRT快速上手指南

    前言 xff1a 最近一段时间接触了TensorRT xff0c 因此顺带整理了一份TensorRT中一些常用关键组件的笔记 xff0c 以方便未来能够快速查阅和上手 需要注意的是本文只是一些常用特性与关键组件的梳理 xff0c 而不是一个
  • YOLO3D 基于图像的3D目标检测算法

    参考文档 xff1a https ruhyadi github io project computer vision yolo3d 代码 xff1a https github com ruhyadi yolo3d lightning 本次分
  • nuscenes激光雷达数据抽稀

    nuScenes文件说明 Mini nuScenes下载后得到名称为 v1 0 mini tgz 的压缩包 xff0c 主要包含maps samples sweeps和v1 0 mini等4个文件夹 下面分别进行简要介绍 maps xff1
  • Ubuntu执行定时命令的方法

    简单使用如下 输入下面的命令安装at xff1a sudo apt span class token operator span get install at 输入下面的命令 xff1a span class token comment e
  • Window10_WSL2 初体验 [win下linux子系统]

    文章目录 参考与前言安装WSL切换wsl2以使用GPU资源启动时进入固定文件夹使用进程使用GPUROS gazebo 仿真待更新 参考与前言 Install WSL 此文主要是写一下windows下怎样快乐使用ubuntu 毫无障碍 xff
  • Linux环境下——C语言聊天室项目界面展示

    运行环境ubuntu12 04 服务器启动 xff1a 用户注册 xff1a 用户登录 xff1a 私聊功能 Id 61 32用户给id 61 33用户发送hello xff1b 群聊功能 xff1a Id 61 33用户向所有人发送hel
  • 算法---短除法求最大公约数

    短除法 短除符号就是除号倒过来 短除就是在除法中写除数的地方写两个数共有的质因数 xff0c 然后落下两个数被公有质因数整除的商 xff0c 之后再除 xff0c 以此类推 xff0c 直到结果互质为止 xff08 两个数互质 xff09
  • Kubernetes(K8S)集群部署搭建图文教程(最全)

    Kubernetes 集群安装 前期准备集群安装系统初始化Harbor采取私有的仓库去镜像使用集群检测集群功能演示 前期准备 第一步 xff1a Router软路由构建 第二步 xff1a centos7安装 5台 xff08 自行安装 x
  • Nginx反向代理部署在K8s上的seafile服务,上传文件缓慢的解决方案

    前言 在k8s上搭建好seafile云文档服务后 xff0c 在拥有公网IP的反向代理服务器上采用Nginx进行反向代理 问题描述 seafile网页上传文件时发现 xff1a 上传几kB的小文件正常 xff0c 上传1MB以上大小的文件卡
  • FreeBSD13简单命令安装KDE5

    span class token comment 经过个人多次测试 xff0c 注释部分是个的经验 xff0c 试过10多次KDE安装总结 xff0c 希望对大家有用 xff0c 谢谢点赞 span span class token fun
  • kali对未知web server透测试1

    靶机渗透 主机IPkali192 168 101 62靶机未知 靶机探测 靶机下载 xff1a https pan baidu com s 1P8s ntf05dRSWOg LrxD Q 提取码 xff1a 1234 1 打开靶机 选择我已
  • kali对未知web server透测试2

    环境介绍 主机IP xff08 NAT xff09 kali192 168 252 128靶机2未知 靶机下载 xff1a https pan baidu com s 1u5xbmU13wheXE4 M508qFw 提取码 xff1a 12
  • MS08_067复现+远程控制

    环境 主机ipkali Linux192 168 252 128Windows xp192 168 252 148 漏洞介绍 https docs microsoft com zh cn security updates Securityb
  • CVE-2020-0796(永恒之黑)复现,影响版本windws10,windos server2016

    漏洞介绍 https nvd nist gov vuln detail CVE 2020 0796 漏洞影响版本 Windows 10 Version 1903 for 32 bit Systems Windows 10 Version 1
  • hackbar工具安装使用教程

    HackBar工具介绍 HackBar 是一个浏览器上的一个插件 xff0c 包含一些黑客常用的工具 xff0c 比如SQL injection XSS 加密等 免费版下载 百度网盘 xff1a https pan baidu com s
  • python 百度aip实现文字识别

    介绍 百度aip模块是用于实现百度云与用户接口 xff0c 简单来说就是使用百度云所拥有的人工智能模块 模块使用 pip install baidu aip 下载百度云模块 登录百度云账号 填写信息 使用官方的文档 https cloud
  • python3 实现股票监控

    实现功能 1 设置股票的卖出个买入的价格 2 程序对价格进行监控 3 当价格达到预定值时发送邮件提醒 模块安装 pip install tushare pip install pandas 如果非常慢 xff1a https blog cs

随机推荐

  • 【网络安全CTF】BUUCTF(Basic篇)

    Linux Labs 解题思路 xff1a 已给用户名密码 xff0c 直接用ssh工具连接即可获取flag 查找flag在跟下 提交完成 BUU LFI COURSE 1 访问链接 xff1a 为php代码审计题 xff0c 看题目要求构
  • 密码学基本概念

    密码学简介 密码是经过加密过后的口令 xff0c 是指用特定的变换对数据信息进行加密保护或者安全身份认证的物质和技术 xff0c 密码学是对安全通信技术的研究 xff0c 要能够有效的防范潜在攻击 xff0c 也就是对信息加密解密的过程 密
  • 部署在k8s上的jenkins代理端口对外开放解决方案

    前言 Jenkins服务部署在k8s集群上 xff0c 之前的项目涉及的代理节点和集群在同一个内网网段 环境 Jenkins 对应jdk版本为openjdk version 34 11 0 18 34 问题描述 Jenkins要添加外部网络
  • Qt 利用stylesheet 设置按钮五态图标

    用过Qt的相信大家都对QPushButton这个类十分熟悉 xff0c 下面将介绍一种利用setstylesheet的方式 xff0c 设置按钮的五种状态 在Qt中QPushButton在视觉上给我们有以下五种状态 xff0c 分别是nor
  • 【Go语言学习】安装与配置

    文章目录 前言一 Go语言学习站二 安装与配置1 安装2 环境变量配置3 Gland编辑器安装与配置Hello World 总结 前言 Go语言特性 Go xff0c 又称为 Golang xff0c 是一门开源的编程语言 xff0c 由
  • 【安全工具】Httpx信息收集

    文章目录 前言一 下载二 使用步骤1 帮助文档2 常用命令常用组合命令 xff1a 总结 前言 HTTPX 是一个功能强大的 HTTP 客户端工具 xff0c 用于执行各种网络任务 xff0c 例如发现 Web 应用程序漏洞 探测域名和端口
  • 【云计算】Hadoop集群安装

    文章目录 前言一 环境二 安装虚拟机及配置配置网络 三 安装Ubuntu及配置下载ISO镜像VMware安装UbuntuUbuntu配置 xff1a 配置结果IP免密登录 JAVA安装hadoop安装 xff1a 文件的作用core sit
  • 图像处理-区域标记

    图像处理 区域标记 Matlab code clc span class token punctuation span close all span class token punctuation span span class token
  • 采用傅里叶变换进行平滑操作

    采用傅里叶变换进行平滑操作 clc close all span class token punctuation span span class token function clear span all span class token
  • 变分推理-ELBO

    变分推理 ELBO 变分推理ELBO 变分推理 变分推理的原理等价于最小化KL散度 xff1a K L q
  • Bayesian Neural Network Recent Papers-贝叶斯神经网络相关研究文章

    Bayesian Neural Network Recent Papers 贝叶斯神经网络相关研究文章 MethodsVariational Inference VI Markov Chain Monte CarloMCMC 43 VIEn
  • Bayes基本概念

    Bayes基本概念 Prior 先验 xff1a p z p z p z 看到数据前的猜测 xff1b Posterior 后验 xff1a
  • vm Debian 9 做服务器

    虚拟机 xff08 vm xff09 Debian 9 做服务器 参考虚拟机Centos做服务器 参考设置静态ip和dns 安装vm 43 debian9 不多说设置中文字符 43 locale安装net tools apt get ins
  • ProXmox VE创建虚拟机

    Proxmox VE Proxmox VirtualEnvironment 是一个非常棒的集成OPENVZ支持KVM应用的环境 有方面易用的WEB界面 xff0c 基于JAVA的UI和内核接口 xff0c 可以登录到VM客户方便的操作 xf
  • 抖音研发实践:基于二进制文件重排的解决方案 APP启动速度提升超15%

    背景 启动是App给用户的第一印象 xff0c 对用户体验至关重要 抖音的业务迭代迅速 xff0c 如果放任不管 xff0c 启动速度会一点点劣化 为此抖音iOS客户端团队做了大量优化工作 xff0c 除了传统的修改业务代码方式 xff0c
  • supervisor安装使用

    supervisord服务进程管理器 一 安装 yum span class token function install span supervisor 二 目录及使用 安装后 1 生成 etc supervisord conf 配置文件
  • laravel引入第三方云平台及使用方法

    一 引入第三方类 1 阿里oss span class token function composer span require jacobcyl ali oss storage 2 1 2 腾讯cos span class token f
  • 在ubuntu上安装多个版本的CUDA,并且可以随时切换

    前言 实验室工作站被多人使用导致需求不同的cuda版本 xff0c 一直没找到一个完全完整靠谱的教程 xff0c 这是我参考几个博客完成测试的全过程记录 xff0c 方便以后操作 xff0c 无任何商业用途 xff0c 如有侵权 xff0c
  • 在CentOS运行APPIMAGE文件时提示AppImages require FUSE to run

    输入如下命令行 xff1a yum enablerepo 61 epel y install fuse sshfs install from EPEL user 61 w h o a m
  • C++中的虚函数详解

    虚函数在运行时绑定 xff0c 即运行时确定执行的函数 所谓的后期绑定就是一个基类中有一个虚函数 xff0c 而派生类中重写了这个函数 xff0c 那么调用的这个虚函数的时候根据类的实例的不同而调用不同的函数 实例化是指在面向对象的编程中