【C++】虚函数

一、什么是虚函数

在类的成员函数前加上virtual关键字,这个函数就是虚函数。

虚函数的所用就是完成多态。多态示例如下:

class A
{
	
public:
	virtual void func()//虚函数
	{
		cout << "A" << endl;
	}
	void ftwo()//普通函数
	{
		cout << "FA" << endl;
	}
private:
	int val=1;
};

class B :public A
{
public:
	void func()
	{
		cout << "B" << endl;
	}
	void Ftwo()
	{
		cout << "FB" << endl;
	}
private:
	int sum = 1;
};

int main()
{
	B b;
	A* pa =&b;//父类指针指向子类对象
	pa->ftwo();
	pa->func();
}

运行结果如下:

可以看到:父类指针调用函数,若该函数是虚函数,则调用子类的同名函数(无同名调用虚函数)。

                  如果不是虚函数,则正常调用父类的普通函数。

二、静态绑定与动态绑定

将一个名称与内存地址关联起来,就是绑定。

静态绑定:在编译时就完成函数的绑定(非虚函数)。

动态绑定:在运行时才完成函数的绑定(虚函数)。

虚函数要执行哪个版本在运行时才知道,所以是动态绑定。

三、虚函数的使用

3.1使用条件

1、使用环境必须是继承,在父类的成员函数前加virtual       

2、一定是指针或引用调用

3.2注意事项

1、虚函数必须有定义

2、构造函数不能是虚函数

3、函数被声明为虚函数后,所有子类该函数都是虚函数

3.3在子类中的使用

1、想使用虚函数完成多态,子类必须重写父类的虚函数

(重写/覆盖:返回值、函数名、参数列表、const属性必须与父类的虚函数相同。vritual可不加,但建议加上。参数的缺省值一定要相同,不然会有糟糕的后果)

2、当父类返回类型是父类指针/引用时,子类返回值可以为子类指针/引用

class A
{
	
public:
	virtual A* func()//返回类型为父类指针
	{
		cout << "A" << endl;
	}
private:
	int val=1;
};
class B :public A
{
public:
	virtual B* func()//返回类型为子类指针
	{
		cout << "B" << endl;
	}
private:
	int sum = 1;
};

int main()
{
	B b;
	A* pa =&b;
	pa->func();
}

3.4final和override说明符

1、final:在虚函数括号后面加,表示该函数无法被重写

2.override:在重写的函数括号后面加,检查重写是否正确(不加这个,重写写错检查不出来)

四、虚函数表、虚函数表指针

4.1虚表指针

编译器储存虚函数的方法是:给对象添加一个隐藏指针,该隐藏指针指向一个函数数组,这个数组被称为虚函数表,该隐藏指针被称为虚表指针(虚函数表指针),该指针存在类对象的最前面。

以下代码中,类里没有成员变量,但有隐藏的虚表指针,所以大小是8。

4.2虚函数表

父类定义虚函数后,父类对象会将虚函数的地址放到虚函数表中,自身存放一个虚表指针。

子类对象会独立的生成一个与父类相同的虚函数表,如果子类重写了父类的虚函数,那么在子类的虚函数表中会将父类的虚函数地址覆盖为自己的虚函数地址。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

黑神话·悟空藕丝步云履怎么获得?来看这一篇

1、传送到花果山-山脚-青嶂道土地庙。 2、在这里召唤筋斗云飞行岛章节刚开始的的初始位置方向 在这里推荐一款旗舰开放式耳机南卡OE Pro2&#xff0c;在目前有许多开放式耳机产品存在佩戴舒适度低且音质表现非常一般的当下&#xff0c;南卡开放式耳机凭借“非常规”的软硬结合…

Vue2电商平台项目 (三) Search模块、面包屑(页面自己跳自己)、排序、分页器!

文章目录 一、Search模块1、Search模块的api2、Vuex保存数据3、组件获取vuex数据并渲染(1)、分析请求数据的数据结构(2)、getters简化数据、渲染页面 4、Search模块根据不同的参数获取数据(1)、 派发actions的操作封装为函数(2)、设置带给服务器的参数(3)、Object.assign整理参…

智慧宿舍平台|基于Springboot+vue的智慧宿舍系统(源码+数据库+文档)

智慧宿舍系统 目录 基于Springbootvue的智慧宿舍系统 一、前言 二、系统设计 三、系统功能设计 四、数据库设计 五、核心代码 六、论文参考 七、最新计算机毕设选题推荐 八、源码获取 博主介绍&#xff1a;✌️大厂码农|毕设布道师&#xff0c;阿里云开发社区乘风者…

java多线程模拟多个售票员从同一个票池售票

程序功能 这段代码模拟了多个售票员从一个有限的票池中售票的过程。主要功能如下&#xff1a; 票池共有50张票&#xff0c;多个售票员&#xff08;线程&#xff09;并发进行售票。 使用同步机制确保线程安全&#xff0c;避免多个售票员同时出售同一张票。 每个售票员不断检查票…

51单片机 - DS18B20实验1-读取温度

上来一张图&#xff0c;明确思路&#xff0c;程序整体裤架如下&#xff0c;通过单总线&#xff0c;单独封装一个.c文件用于单总线的操作&#xff0c;其实&#xff0c;我们可以把点c文件看成一个类操作&#xff0c;其属性就是我们面向对象的函数&#xff0c;也叫方法&#xff0c…

软考中级软件设计师——数据结构与算法基础学习笔记

软考中级软件设计师——数据结构与算法基本概念 什么是数据数据元素、数据项数据结构逻辑结构物理结构&#xff08;存储结构&#xff09; 算法什么是算法五个特性算法效率的度量时间复杂度空间复杂度 什么是数据 数据是信息的载体&#xff0c;是描述客观事物属性的数、字符及所…

【算法】队列与BFS

【ps】本篇有 4 道 leetcode OJ。 目录 一、算法简介 二、相关例题 1&#xff09;N 叉树的层序遍历 .1- 题目解析 .2- 代码编写 2&#xff09;二叉树的锯齿形层序遍历 .1- 题目解析 .2- 代码编写 3&#xff09;二叉树最大宽度 .1- 题目解析 .2- 代码编写 4&#xf…

自养号测评:如何在敦煌网打造爆款与提升店铺权重

敦煌网自养号测评是敦煌网卖家为了提升店铺权重、流量及销量而采取的一种策略。自养号测评指的是卖家自行注册并管理买家账号&#xff0c;通过模拟真实买家行为&#xff0c;为自家店铺进行测评、补单等操作。以下是对敦煌网自养号测评的详细解析&#xff1a; 一、自养号测评的…

Text-to-SQL技术升级 - 阿里云OpenSearch-SQL在BIRD榜单夺冠方法

Text-to-SQL技术升级 - 阿里云OpenSearch-SQL在BIRD榜单夺冠方法 Text-to-SQL 任务旨在将自然语言查询转换为结构化查询语言(SQL),从而使非专业用户能够便捷地访问和操作数据库。近期,阿里云的 OpenSearch 引擎凭借其一致性对齐技术,在当前极具影响力的 Text-to-SQL 任务…

3.接口测试的基础/接口关联(Jmeter工具/场景一:我一个人负责所有的接口,项目规模不大)

一、Jmeter接口测试实战 1.场景一&#xff1a;我一个人负责所有的接口&#xff1a;项目规模不大 http:80 https:443 接口文档一般是开发给的&#xff0c;如果没有那就需要抓包。 请求默认值&#xff1a; 2.请求&#xff1a; 请求方式:get,post 请求路径 请求参数 查询字符串参数…

马匹行为识别系统源码分享

马匹行为识别检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

【自动驾驶】决策规划算法 | 数学基础(三)直角坐标与自然坐标转换Ⅱ

写在前面&#xff1a; &#x1f31f; 欢迎光临 清流君 的博客小天地&#xff0c;这里是我分享技术与心得的温馨角落。&#x1f4dd; 个人主页&#xff1a;清流君_CSDN博客&#xff0c;期待与您一同探索 移动机器人 领域的无限可能。 &#x1f50d; 本文系 清流君 原创之作&…

UE5源码Windows编译、运行

官方文档 Welcome To Unreal Engine 5 Early Access Learn what to expect from the UE5 Early Access program. 链接如下&#xff1a;https://docs.unrealengine.com/5.0/en-US/Welcome/#gettingue5earlyaccessfromgithub Step 0&#xff1a;找到UE5源码 直接先上链接 https…

5.内容创作的未来:ChatGPT如何辅助写作(5/10)

引言 在信息爆炸的时代&#xff0c;内容创作已成为连接品牌与受众、传递信息与知识、以及塑造文化与观念的重要手段。随着数字媒体的兴起&#xff0c;内容创作的需求日益增长&#xff0c;对创作者的写作速度和质量提出了更高的要求。人工智能&#xff08;AI&#xff09;技术的…

旧衣回收小程序:开启旧衣回收新体验

随着社会的大众对环保的关注度越来越高&#xff0c;旧衣物回收市场迎来了快速发展时期。在数字化发展当下&#xff0c;旧衣回收行业也迎来了新的模式----互联网旧衣回收小程序&#xff0c;旨在为大众提供更加便捷、简单、透明的旧衣物回收方式&#xff0c;通过手机直接下单&…

在线包装盒型生成工具,各种异型包装盒型,PDF导出方便

1、templatemaker.nl Passepartout ✂ Templatemaker ︎https://www.templatemaker.nl/en/passepartout/这是一个荷兰设计师建的一个在线盒型自动生成工具&#xff0c;包含各类新奇盒型&#xff0c;大家可以一起去观摩一下。 网站首页顶部各种盒型展示&#xff0c;大家根据需…

开源|一个很强大的离线IP地址定位库和IP定位数据管理框架,支持亿级别的数据段

开源|一个很强大的离线IP地址定位库和IP定位数据管理框架&#xff0c;支持亿级别的数据段 不太会写-9527 卓越云阶 2024年09月18日 12:35 贵州 随着互联网技术的飞速发展&#xff0c;IP地址定位已成为许多应用程序中不可或缺的一部分。然而&#xff0c;现有的许多定位库在处理…

刻意练习:舒尔特方格提升专注力

1.功能描述 刻意练习&#xff1a;舒尔特方格提升专注力 如果发现自己存在不够专注的问题&#xff0c;可以通过一个小游戏来提升自己专注力--舒尔特方格。 舒尔特方格的实施步骤如下&#xff1a; 一张纸上画出5X5的空方格。在方格中&#xff0c;没有任何规律的随机填写数字1…

LeetCode_sql_day24(1212.查询球队积分)

描述 表: Teams ------------------------- | Column Name | Type | ------------------------- | team_id | int | | team_name | varchar | ------------------------- team_id 是该表具有唯一值的列。 表中的每一行都代表一支独立足球队。表: Matches…

VSCode扩展连接虚拟机MySQL数据库

在虚拟机安装MySQL vscode通过ssh远程登录Ubuntu 在vscode终端运行以下命令。 sudo apt-get install mysql-server-5.7 用以下命令确认MySQL是否安装完成。 sudo mysql MySQL安装成功。 在VSCode安装SQL扩展 扩展名&#xff1a;MySQL Shell for VS Code。 安装完成后&am…