C++学习Day07之虚函数和纯虚函数
目录
- 前言
- 一、程序及输出
- 1.1 虚函数
- 1.2 纯虚函数
- 1.2.1 定义、示例
- 1.2.2 引入原因
- 1.2.3 抽象类
- 二、分析与总结
前言
在 C++ 中,虚函数和纯虚函数是实现多态性的重要概念。虚函数是在基类中声明为虚函数的函数,在派生类中可以被重写,实现动态联编。而纯虚函数是在基类中声明为纯虚函数的函数,没有具体的实现,需要在派生类中实现,用于定义接口。
一、程序及输出
1.1 虚函数
定义一个函数为虚函数,不代表函数为不被实现的函数。
定义他为虚函数是为了允许用基类的指针来调用子类的这个函数。
#include <iostream>class Base {
public:virtual void print() {std::cout << "Base class" << std::endl;}
};class Derived : public Base {
public:void print() override {std::cout << "Derived class" << std::endl;}
};int main() {Base* b = new Base();Base* d = new Derived();b->print(); // 动态联编,调用 Base 类的 print 方法d->print(); // 动态联编,调用 Derived 类的 print 方法
}
输出:

1.2 纯虚函数
1.2.1 定义、示例
纯虚函数是在基类中声明的虚函数,它在基类中没有定义,但要求任何派生类都要定义自己的实现方法。在基类中实现纯虚函数的方法是在函数原型后加 =0:
定义一个函数为纯虚函数,代表函数没有被实现。
定义纯虚函数是为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数。
#include <iostream>class Base {
public:virtual void print() = 0; // 纯虚函数声明
};class Derived : public Base {
public:void print() override {std::cout << "Derived class" << std::endl;}
};int main() {// Base* b = new Base(); // 无法实例化含有纯虚函数的类Base* d = new Derived();d->print(); // 动态联编,调用 Derived 类的 print 方法
}
输出:

1.2.2 引入原因
在很多情况下,基类本身生成对象是不合情理的。例如,动物作为一个基类可以派生出老虎、孔雀等子类,但动物本身生成对象明显不合常理。
为了解决上述问题,引入了纯虚函数的概念,将函数定义为纯虚函数(方法:virtual ReturnType Function()= 0;),则编译器要求在派生类中必须予以重写以实现多态性。同时含有纯虚拟函数的类称为抽象类,它不能生成对象。这样就很好地解决了上述两个问题。
声明了纯虚函数的类是一个抽象类。所以,用户不能创建类的实例,只能创建它的派生类的实例。
纯虚函数最显著的特征是:它们必须在继承类中重新声明函数(不要后面的=0,否则该派生类也不能实例化),而且它们在抽象类中往往没有定义。
1.2.3 抽象类
在 C++ 中,抽象类是包含至少一个纯虚函数(纯虚函数是指在基类中没有给出具体实现的虚函数)的类。抽象类不能被实例化,只能作为基类来派生出其他类。抽象类的主要作用是定义接口,强制派生类实现这些接口。
抽象类不能被实例化,只能作为基类使用。
抽象类中可以包含普通成员函数、虚函数和纯虚函数。
如果一个类包含至少一个纯虚函数,那么这个类就是抽象类。
派生类必须实现抽象类中的所有纯虚函数,否则派生类也会成为抽象类。
抽象类的目的是定义接口,提供一种规范,强制派生类实现这些接口。
抽象类通常用于设计框架或基类,提供一种多态的方式来处理不同类型的派生类对象。
二、分析与总结
虚函数:为了允许用基类的指针来调用子类的这个函数
纯虚函数:为了实现一个接口,起到一个规范的作用,规范继承这个类的程序员必须实现这个函数
抽象类:抽象类是包含至少一个纯虚函数的类
参考链接:
C++虚函数详解
相关文章:
C++学习Day07之虚函数和纯虚函数
目录 前言一、程序及输出1.1 虚函数1.2 纯虚函数1.2.1 定义、示例1.2.2 引入原因1.2.3 抽象类 二、分析与总结 前言 在 C 中,虚函数和纯虚函数是实现多态性的重要概念。虚函数是在基类中声明为虚函数的函数,在派生类中可以被重写,实现动态联…...
GZ036 区块链技术应用赛项赛题第9套
2023年全国职业院校技能大赛 高职组 “区块链技术应用” 赛项赛卷(9卷) 任 务 书 参赛队编号: 背景描述 随着异地务工人员的增多,房屋租赁成为一个广阔是市场;目前,现有技术中的房屋租赁是由…...
微服务—RabbitMQ高级(延迟消息)
本博客为个人学习笔记,学习网站:2023黑马程序员RabbitMQ入门到实战教程 高级篇章节 目录 延迟消息 死信交换机 延迟消息插件 下载安装 延迟交换机声明 编辑 发送延迟消息 订单状态同步问题 延迟消息 在电商的支付业务中,对于一些库…...
香港服务器如何取消windows的自动更新
大家用过电脑的人对windows系统的自动更新应该都不会陌生,其实香港服务器的使用也是一样的方法。为什么要对香港服 务器windows的自动更新进行关闭呢?其主要原因在于,有些更新是不能更新,一更新话,系统反而会变得不稳定…...
kali虚拟机桥接模式快速设置
第一步:选择 虚拟机 > 设置 > 虚拟机设置,设置桥接模式 不选择复制物理网络连接状态选项: 如果采用DHCP的方式来分配IP地址,当电脑网络从有线或无线网络之间进行移动时,DHCP会重新分配ip地址,即虚拟机…...
「连载」边缘计算(十五)02-18:边缘部分源码(源码分析篇)
(接上篇) ChannelContext struct定义如下所示。 KubeEdge/beehive/pkg/core/context/context.go // ChannelContext is object for Context channel type ChannelContext struct { //ConfigFactory goarchaius.ConfigurationFactory channels map[…...
MySQL性能调优篇(8)-NoSQL与MySQL的比较
MySQL数据库是一种关系型数据库,而NoSQL是一种非关系型数据库。它们在数据存储和处理方式、数据模型和可扩展性等方面存在一些明显的差异。本文将对MySQL数据库和NoSQL进行比较,并介绍它们的优势和劣势。 首先,MySQL使用表格的形式来存储数据…...
【Linux学习】线程池
目录 23.线程池 23.1 什么是线程池 23.2 为什么需要线程池 23.3 线程池的应用场景 23.4 实现一个简单的线程池 23.4.1 RAII风格信号锁 23.4.2 线程的封装 23.4.3 日志打印 22.4.4 定义队列中存放Task类任务 23.4.5 线程池的实现(懒汉模式) 为什么线程池中需要有互斥锁和条件变…...
利用Docker部署一个简单的springboot项目
文章目录 1、首先利用docker部署一个redis中间件1.1、下载redis镜像1.2、在主机创建redis挂载的目录和文件1.3、部署redis中间件 2、创建springboot项目2.1、修改application.yml2.2、编写controller2.3、启动应用并测试访问 3、将应用打包成镜像3.1、编写Dockerfile3.2、上传文…...
【Java】纯小白的三种工厂模式基础知识学习笔记
工厂模式概念 在Java中,工厂模式是一种设计模式,用于创建对象而无需指定明确的类。工厂模式通过定义一个共同的接口或抽象类来创建对象,然后由工厂类根据特定条件或参数来实例化具体的对象。 工厂模式通常包括三种类型:简单工厂…...
Spring Boot 笔记 006 创建接口_注册
1.1 由于返回数据都是以下这种格式,那么久再编写一个result实体类 报错了,原因是没有构造方法 可以使用lombok的注解自动生成,添加无参的构造器和全参的构造器 package com.geji.pojo;import lombok.AllArgsConstructor; import lombok.NoArg…...
沁恒CH32V30X学习笔记08---基本定时器超时功能
TIM 基本定时器 高级定时器模块包含一个功能强大的 16 位自动重装定时器(TIM1、TIM8、TIM9 和 TIM10) 通用定时器模块包含一个 16 位可自动重装的定时器(TIM2、TIM3、TIM4 和 TIM5) 基本定时器模块包含一个 16 位可自动重装的定时器(TIM6 和 TIM7) 定时器的结构大致可…...
GitHub | 在 GitHub 上在线展示 Vue 项目
简洁版:上传所有代码 << 构建项目并上传 dist 目录 << 设置仓库 << 访问 Step1:在 GitHub 上新建仓库,并将 Vue 项目的代码 push 到该仓库中。坑点在于,如果你是从 GitHub 上 clone 的别人的项目,那…...
Android的Compose
Jetpack Compose 是用于构建原生 Android 界面的新工具包,无需修改任何 XML 布局,也不需要使用布局编辑器。相反,只需调用可组合函数来定义所需的元素,Compose 编译器即会完成后面的所有工作。 简而言之,使用Compose&…...
C++ STL->list模拟实现
theme: smartblue list list文档 list是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。list的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向 其前一个元素…...
基于python+django+vue.js开发的健身房管理系统
功能介绍 平台采用B/S结构,后端采用主流的Python语言进行开发,前端采用主流的Vue.js进行开发。 功能包括:教练管理、会员管理、场地管理、设备管理、用户管理、日志管理、系统信息模块。 源码地址 https://github.com/geeeeeeeek/python_…...
GPT-4对编程开发的支持
在编程开发领域,GPT-4凭借其强大的自然语言理解和代码生成能力,能够深刻理解开发者的意图,并基于这些需求提供精准的编程指导和解决方案。对于开发者来说,GPT-4能够在代码片段生成、算法思路设计、模块构建和原型实现等方面给予开…...
“成像光谱遥感技术中的AI革命:ChatGPT应用指南“
遥感技术主要通过卫星和飞机从远处观察和测量我们的环境,是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型,在理解和生成人类语言方面表现出了非凡的能力。本课程重点介绍ChatGPT在遥感中的应用,人工智…...
12.25 校招 实习 内推 面经
绿*泡*泡VX: neituijunsir 交流*裙 ,内推/实习/校招汇总表格 1、校招 | 百度2024校园招聘持续热招中 校招 | 百度2024校园招聘持续热招中 2、校招 | 毫末智行2024秋招补录进行时 校招 | 毫末智行2024秋招补录进行时 3、实习丨蔚来2024届冬季实习生计…...
深度学习基础之《TensorFlow框架(3)—TensorBoard》
一、TensorBoard可视化学习 1、TensorFlow有一个亮点就是,我们能看到自己写的程序的可视化效果,这个功能就是TensorBoard 2、TensorFlow可用于训练大规模深度神经网络所需的计算,使用该工具涉及的计算往往复杂而深奥。为了方便TensorFlow程…...
知识竞赛软件售后服务哪家好?真实用户评价与选购指南
知识竞赛软件售后服务哪家好?真实用户评价揭秘在数字化教学与企业培训普及的今天,知识竞赛软件已成为学校、企业和各类机构开展活动的得力工具。然而,软件购买并非一锤子买卖,售后服务的质量直接关系到软件能否长期稳定运行、活动…...
工资条生成器:财务人员的高效办公利器
在企业财务管理工作中,工资条的制作与发放是一项既繁琐又重要的任务。 传统的手工制作方式不仅耗时耗力,还容易出现数据错误和格式不统一的问题。 工资条生成器的出现,为财务人员带来了全新的解决方案。 这款软件专门针对财务工作场景设计…...
【2026年最新600套毕设项目分享】springboot仁和机构的体检预约系统(14336)
有需要的同学,源代码和配套文档领取,加文章最下方的名片哦 一、项目演示 项目演示视频 二、资料介绍 完整源代码(前后端源代码SQL脚本)配套文档(LWPPT开题报告/任务书)远程调试控屏包运行一键启动项目&…...
如何从零搭建Cubli_Mini:开源自平衡机器人完整制作指南
如何从零搭建Cubli_Mini:开源自平衡机器人完整制作指南 【免费下载链接】Cubli_Mini 项目地址: https://gitcode.com/gh_mirrors/cu/Cubli_Mini Cubli_Mini是一款令人惊叹的开源自平衡立方体机器人项目,它通过三个正交安装的飞轮实现姿态控制&am…...
Python 中的数据结构与算法:从基础到应用
Python 中的数据结构与算法:从基础到应用 1. 背景介绍 数据结构与算法是计算机科学的核心基础,它们决定了程序的效率和性能。在 Python 中,掌握常用的数据结构和算法不仅可以提高代码质量,还能解决复杂问题。本文将深入探讨 Pytho…...
读硕士是否有必要?
一、研究方法说明 数据来源 本报告数据来源于以下公开渠道(2024-2025年),所有结论均有真实数据支撑:来源说明麦可思研究院《2025年中国本科生就业报告》权威第三方教育研究机构猎聘《2025人才供需洞察》《2025上半年人才供需洞察报…...
对接亚马逊 SP-API(Amazon Selling Partner API) 第一章:AWS IAM 配置详解
1. AWS IAM 基础概念扫盲 第一次接触亚马逊SP-API的开发者,往往会在IAM配置环节卡壳。我见过不少团队在这个阶段浪费两三周时间反复调试,其实只要理解几个核心概念就能事半功倍。IAM(Identity and Access Management)就像亚马逊AW…...
2025届学术党必备的六大AI科研网站推荐榜单
Ai论文网站排名(开题报告、文献综述、降aigc率、降重综合对比) TOP1. 千笔AI TOP2. aipasspaper TOP3. 清北论文 TOP4. 豆包 TOP5. kimi TOP6. deepseek 为能切实有效地把文本的AIGC检测概率给降低下来,得从业经历连贯性以及统计规律这…...
【深度学习OFDM信号处理】Deep-Waveform:基于复值神经网络的端到端OFDM接收机设计与实现【附MATLAB/Python代码】
1. 为什么需要深度学习处理OFDM信号? 传统OFDM接收机依赖离散傅里叶变换(DFT)进行时频域转换,这种固定算法在面对复杂无线环境时存在明显局限。我在实际项目中遇到过这样的情况:当信道出现严重多径衰落时,传…...
UVM调试利器:print_topology()与factory.print()的实战应用
1. UVM调试利器:print_topology()与factory.print()的核心价值 在UVM验证环境中,调试就像是在迷宫里找路,而print_topology()和factory.print()就是你的手电筒和地图。这两个函数我用了快八年,每次遇到环境结构问题都能帮我省下至…...
