C++ 中的虚函数和多态性

C++ 是一种高级编程语言,它具有面向对象编程的特性。在 C++ 中,虚函数和多态性是非常重要的概念,它们使得继承关系更加灵活和强大。

虚函数是在基类中声明为虚函数的成员函数,其作用是在运行时动态绑定函数的调用。当在派生类中重写基类的虚函数时,编译器会自动生成一个虚函数表(vtable),该表包含了基类和派生类中所有的虚函数指针。在运行时,通过虚函数表来确定应该调用哪个函数。

多态性是指同一个函数在不同的对象上表现出不同的行为。在 C++ 中,多态性是通过虚函数实现的。当函数被声明为虚函数时,编译器会为该函数生成一个虚函数表指针,并将该指针存储在每个派生类的对象中。当调用一个虚函数时,编译器会根据对象的实际类型来选择应该调用哪个函数。

下面是一个简单的示例,演示了虚函数和多态性的使用:

#include <iostream>class Animal {
public:virtual void eat() {std::cout << "Animal is eating." << std::endl;}
};class Dog : public Animal {
public:void eat() override {std::cout << "Dog is eating." << std::endl;}
};int main() {// 创建一个 Animal 对象Animal* animal = new Animal();// 创建一个 Dog 对象Dog* dog = new Dog();// 调用 eat 函数animal->eat();dog->eat();delete animal;delete dog;return 0;
}

在这个示例中,我们定义了一个基类 Animal,并在其中声明了一个虚函数 eat。然后,我们定义了一个派生类 Dog,并在其中重写了 eat 函数。在 main 函数中,我们创建了一个 Animal 对象和一个 Dog 对象,并分别调用了它们的 eat 函数。由于 eat 函数是虚函数,所以编译器会根据对象的实际类型来选择应该调用哪个函数。在这个例子中,我们可以看到,当我们调用 animal->eat() 时,实际上是在调用 Animal 类中的 eat 函数,而当我们调用 dog->eat() 时,实际上是在调用 Dog 类中的 eat 函数。

通过虚函数和多态性,我们可以编写更加灵活和可扩展的代码,从而提高代码的复用性和维护性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/751354.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【软考高项】七、信息技术发展之存储、数据库、信息安全

1、存储知识点 存储类型分&#xff1a;封闭式&#xff08;小型机&#xff09;和开放式&#xff08;服务器&#xff09; 其中开放式又分内置和外挂存储&#xff08;直连DAS、网格FAS&#xff08;NAS/SAN&#xff09;&#xff09; 2、数据库知识点 数据结构模型&#xff1a; …

【晴问算法】入门篇—贪心算法—最大组合整数

题目描述 现有0~9中各个数的个数&#xff0c;将它们组合成一个整数&#xff0c;求能组合出的最大整数。 输入描述 在一行中依次给出0-9中各个数的个数&#xff08;所有个数均在0-100之间&#xff09;。数据保证至少有一个数的个数大于0。 输出描述 输出一个整数&#xff0c;表示…

Python网络爬虫内容介绍

Python爬虫是使用Python语言编写的网络爬虫程序&#xff0c;用于从互联网上自动抓取、解析和处理数据。爬虫可以模拟人类的行为&#xff0c;自动访问网页、提取所需信息&#xff0c;并将这些信息保存到本地或数据库中&#xff0c;以供后续分析和使用。 Python爬虫的内容主要包…

MyBatisPlus 之一:Spring 整合 MyBatisPlus 及雪花算法

1. Mybatis-Plus简介 Mybatis-Plus&#xff08;简称MP&#xff09;是一个 Mybatis 的增强工具&#xff0c;在 Mybatis 的基础上只做增强不做改变&#xff0c;为简化开发、提高效率而生。这是官方给的定义&#xff0c;关于mybatis-plus的更多介绍及特性&#xff0c;可以参考http…

【NC14399】素数判断

题目 素数判断 分解质因数 思路 题目很直接&#xff0c;给你一个数&#xff0c;判断其是不是素数&#xff0c;如果是&#xff0c;输出一句话和它本身&#xff0c;如果不是&#xff0c;输出一句话和它的质因数&#xff0c;需要注意的是质因数要从小到大输出。 我们知道&#x…

蓝桥杯第 6 场 小白入门赛 2.猜灯谜(for + 数组)

思路&#xff1a;注意是环形排列的灯笼&#xff0c;它的谜底是相邻两个灯笼的数字之和。这道题要用到两个数组&#xff0c;ans存答案&#xff0c;a存原数据。数据读入部分就不用说了&#xff0c;重点就是单独写明ans[0]和ans[n-1]两个取值&#xff0c;其他的用for循环数组就可以…

数据结构——栈和队列的表示与实现详解

目录 1.栈的定义与特点 2.队列的定义与特点 3.案例引入 4.栈的表示和操作的实现 1.顺序栈的表示 代码示例&#xff1a; 2.顺序栈的初始化 代码示例&#xff1a; 3.判断栈是否为空 代码示例&#xff1a; 4.求顺序栈长度 代码示例&#xff1a; 5.清空顺序栈 …

如何实现图片上传至服务器

在绝大多数的项目中都会涉及到文件上传等&#xff0c;下面我们来说一下技术派中是如何实现原生图片上传的&#xff0c;这个功能说起来简单&#xff0c;但其实对于技术还是有考验的。图片的上传涉及到IO读写&#xff0c;一个文件上传的功能&#xff0c;就可以把IO流涉及到的知识…

PyTorch学习笔记之激活函数篇(六)

6、RReLU函数 对应的论文链接&#xff1a;https://arxiv.org/pdf/1505.00853.pdf 6.1 公式 RReLU函数的公式&#xff1a; f ( x ) { x , x > 0 α x , x < 0 f(x) \begin{cases} x&,x>0 \\ \alpha x&,x<0 \end{cases} f(x){xαx​,x>0,x<0​ …

rust - 一个日志缓存记录的通用实现

本文给出了一个通用的设计模式&#xff0c;通过建造者模式实例化记录对象&#xff0c;可自定义格式化器将实例化后的记录对象写入到指定的缓存对象中。 定义记录对象 use chrono::prelude::*; use std::{cell::RefCell, ffi::OsStr, fmt, io, io::Write, path::Path, rc::Rc,…

✅技术社区—通过Canal框架实现MySQL与ElasticSearch的数据同步

Canal 是一个由阿里巴巴开源的&#xff0c;基于 Java 的数据库变更日志解析的中间件&#xff0c;其原理是基于Binlog订阅的方式实现&#xff0c;模拟一个MySQL Slave 订阅Binlog日志&#xff0c;从而实现CDC&#xff0c;主要用于实现 MySQL 数据库的增量数据同步。它主要的使用…

模块化项目Eclipse测试网零撸教程

简介&#xff1a;Eclipse 是一个基于 Solana 区块链的初创项目&#xff0c;致力于构建基于 Solana 虚拟机的通用 Layer2 解决方案&#xff0c;为以太坊提供更快速、更通用的 Rollup 技术。其主要用途是为开发者提供构建基于 Solana 虚拟机的 Rollup 应用的平台&#xff0c;解决…

Vue3-响应式基础:单文件和组合式文件

单文件&#xff1a;html <!DOCTYPE html> <html> <head><title>响应式基础</title> </head> <body><div id"app" ><!-- dynamic parameter:同样在指令参数上也可以使用一个 JavaScript 表达式&#xff0c;需要包…

企业微信H5文件下载。

废话不多说&#xff0c;直接上代码。 1.判断是不是企业微信打开的 const ua navigator.userAgent.toLowerCase() if (/micromessenger/.test(ua)) {} 2.复制功能 navigator.clipboard.writeText(newsUrl).then(() > {this.$message({message: 您已复制文件链接&#xff…

leetcode513找树左下角的值

解法1&#xff1a;BFS 思路就是层序遍历 用队列记住每层的元素&#xff0c;如果每次记住每层的第一个元素 ---->https://programmercarl.com/0102.%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E5%B1%82%E5%BA%8F%E9%81%8D%E5%8E%86.html#_102-%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A…

微调大型语言模型(LLM):应用案例示例

微调大型语言模型&#xff08;LLM&#xff09;&#xff1a;应用案例示例 摘要&#xff1a; 本文讨论了大型语言模型&#xff08;LLM&#xff09;的微调&#xff0c;这是一种通过少量数据训练已经预训练好的模型以执行特定任务的过程。微调可以让LLM在翻译、文本分类、文本生成…

SpringBoot(整合MyBatis + MyBatis-Plus + MyBatisX插件使用)

文章目录 1.整合MyBatis1.需求分析2.数据库表设计3.数据库环境配置1.新建maven项目2.pom.xml 引入依赖3.application.yml 配置数据源4.Application.java 编写启动类5.测试6.配置类切换druid数据源7.测试数据源是否成功切换 4.Mybatis基础配置1.编写映射表的bean2.MonsterMapper…

从零到一构建短链接系统(五)

1.修改UserService Service public class UserServiceImpl extends ServiceImpl<UserMapper, UserDO> implements UserService {public UserRespDTO getUserByUsername(String username) {LambdaQueryWrapper<UserDO> queryWrapper Wrappers.lambdaQuery(UserDO.c…

MySQL实战:监控

监控指标 性能类指标 名称说明QPS数据库每秒处理的请求数量TPS数据库每秒处理的事务数量并发数数据库实例当前并行处理的会话数量连接数连接到数据库会话的数量缓存命中率Innodb的缓存命中率 功能类指标 名称说明可用性数据库是否正常对外提供服务阻塞当前是否有阻塞的会话…

HarmonyOS-鸿蒙系统概述

你了解鸿蒙系统吗&#xff1f; 你看好鸿蒙系统吗&#xff1f; 今年秋季即将推出的HarmonyOS Next 星河版热度空前&#xff0c;一起来了解一下吧。本文将从HarmonyOS 的应用场景、发展历程、架构、开发语言、开发工具、生态建设六个角度聊一聊个人的理解。 1、应用场景 鸿蒙…