C++多态性——(3)动态联编的实现——虚函数

归纳编程学习的感悟,
记录奋斗路上的点滴,
希望能帮到一样刻苦的你!
如有不足欢迎指正!
共同学习交流!
🌎欢迎各位→点赞 👍+ 收藏⭐ + 留言​📝
成功的秘诀就在于多努力一次!

一起加油!

目录

一、前言:

二、虚函数的声明:

三、虚函数的调用: 

💦        例:虚函数实现动态联编。

🔑说明:

四、总结:

五、共勉: 


一、前言:

        上一节中,基类的指针既可以指向基类的对象,又可以指向派生类的对象。但是,当它指向派生类的对象时,并没有按照期望调用派生类中的GetArea()函数它仍然调用基类的GetArea()函数导致运行结果出错。要解决这个问题就要用虚函数。
        虚函数是实现动态联编的基础,它是一种动态的重载方式,它允许在运行时建立函数调用与函数体之间的联系,也就是在运行时才决定如何动作,即动态联编。
        基类的指针指向它的公有派生对象时,访问公有派生类中继承自基类的公有成员,可采用显式的方法,如GetArea(),或采用指针强制类型转换的方法:

p=&r;
p->GetArea();

        但这两种方法都没有达到动态调用的效果,若要实现动态的调用功能,需要将函数Area0声明为虚函数。

二、虚函数的声明:

        虚函数是一个在基类中声明为 virtual的函数,并在一个或多个派生类中被重新定义的成员函数,虚函数的声明格式如下:


                        virtual <返回值类型><函数名>(<参数表>);

        虚函数的定义非常简单,就是基类的函数加上一个 virtual说明,基类中声明为 virtual的函数一般在派生类中需要重新定义。

        在重新定义时,参数的类型和个数必须相同,一旦一个函数被声明为虚函数,则无论声明它的类被继承了多少层,在每一层派生类中该函数都继续保持虚函数特性。 

三、虚函数的调用: 

        如果某个类中一个成员函数被说明为虚函数,意味着该成员函数在派生类中可能有不同的函数实现,当使用对象指针或对象引用调用虚函数时,采用动态联编方式,即在运行时进行关联或绑定。

💦        例:虚函数实现动态联编。

#include<iostream>
using namespace std;
class mybase
{
	private:
		int a,b;
	public:
		mybase(int x,int y):a(x),b(y){    }
		virtual void show()
		{
			cout<<"基类 mybase"<<endl;
			cout<<a<<" "<<b<<endl;	
		}	
};
class myclass:public mybase
{
	private:
		int c;
	public:
		myclass(int x,int y,int z):mybase(x,y),c(z){ 	}
		void show()
		{
			cout<<"派生类 myclass"<<endl;
			cout<<"c="<<c<<endl; 
		}
};
int main()
{
	mybase mb(50,50),*pm;
	myclass mc(10,20,30);
	pm=&mb;
	pm->show();
	pm=&mc;
	pm->show();
	return 0;
}

🔑说明:

        (1)虚函数与重载不同,虚函数参数类型个数完全相同。
        (2)定义一个基类的对象指针或者基类对象引用,就可以指向不同派生类的对象同时调用不同派生类的虚函数。这就是动态联编的结果。 

四、总结:

  • 虚函数的定义非常简单,就是基类的函数加上一个 virtual说明,基类中声明为 virtual的函数一般在派生类中需要重新定义。
  • 在重新定义时,参数的类型和个数必须相同,一旦一个函数被声明为虚函数,则无论声明它的类被继承了多少层,在每一层派生类中该函数都继续保持虚函数特性。 
  • 虚函数与重载不同,虚函数参数类型个数完全相同。
  • 定义一个基类的对象指针或者基类对象引用,就可以指向不同派生类的对象同时调用不同派生类的虚函数。这就是动态联编的结果。 

五、共勉: 

        以上就是我对C++多态性——(3)动态联编的实现——虚函数的理解,希望本篇文章对你有所帮助,也希望可以支持支持博主,后续博主也会定期更新学习记录,记录学习过程中的点点滴滴。如果有不懂和发现问题的小伙伴,请在评论区说出来哦,同时我还会继续更新对C++多态性的理解,请持续关注我哦!!! 

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

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

相关文章

Sam Altman的一天被曝光!每天15小时禁食、服用小剂量安眠药,尽可能避免开会

Sam Altman在经历了几天混乱的管理重组后&#xff0c;重新回到了OpenAI的CEO位置。在日常生活中&#xff0c;奥特曼与许多科技行业高管一样&#xff0c;痴迷于延长自己的寿命。 据报道&#xff0c;他还为应对末日场景&#xff08;致命合成病毒的释放、核战争和人工智能攻击等&…

【AIGC摄影构图prompt】与重不同的绘制效果,解构主义+优美连拍提示效果

提取关键词构图&#xff1a; 激进解构主义 在prompt中&#xff0c;激进解构主义的画面效果可能是一种颠覆传统和权威的视觉呈现。这种画面可能以一种极端或激烈的方式表达对现有社会结构和观念体系的批判和质疑。 具体来说&#xff0c;这种画面效果可能包括&#xff1a; 破…

流媒体学习之路(WebRTC)——Pacer与GCC(5)

流媒体学习之路(WebRTC)——Pacer与GCC&#xff08;5&#xff09; —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标&#xff1a;可以让大家熟悉各类Qos能力、带宽估计能力&#xff0c;提供每个环节关键参数调节接口并实现一个json全…

相关性与P值

相关性与P值 0 FQA&#xff1a;1 相关性与显著性的关系2 相关性分析3 使用medcalc进行相关性分析&#xff1a;参考文章&#xff1a; 0 FQA&#xff1a; 主要描述相关性和p值分别代表什么意义&#xff1f; 以及如何使用medcalc计算相关性和p值。 Q1&#xff1a;p值代表什么意义…

Document对象详解

前言 在前端开发中&#xff0c;DOM&#xff08;文档对象模型&#xff09;扮演着重要的角色。它允许我们使用JavaScript来与网页文档进行交互&#xff0c;实现动态的网页效果。DOM的核心部分之一就是Document对象&#xff0c;它代表了整个HTML文档。在本篇博客中&#xff0c;我们…

【笔记】书生·浦语大模型实战营——第一课

群公告 1月3日*更新 第一次课程视频链接&#xff1a;https://www.bilibili.com/video/BV1Rc411b7ns/&#xff0c;第一次课程只需要记笔记&#xff0c;没有作业。第一次课程(1月3日)和第二次课程(1月5日)到本周末(1月7日)截止&#xff0c;笔记记录在 知乎/CSDN/Github 或者任何你…

2023年互联网公司年度崩盘报告

B站崩了两次 2023年3月5日晚20:20左右&#xff0c;许多网友表示在使用B站时&#xff0c;手机和电脑端都无法访问视频详情页&#xff0c;且手机端无法查看收藏夹与历史记录。 8月4日晚间&#xff0c;距离上次事故5个月后&#xff0c;又有许多网友反馈B站图片&#xff08;视频封…

定时器PWM控制RGB彩灯案例

1.脉冲宽度调制PWM PWM&#xff08;Pulse Width Modulation&#xff09;简称脉宽调制&#xff0c;是利用微处理器的数字输出来对模拟电路进行控制的一种非常有效的技术&#xff0c;广泛应用在测量、通信、工控等方面。   PWM的一个优点是从处理器到​​ ​被控系统​​​信号…

软碟通UltraISO制作U盘安装Ubuntu

清华大学开源软件镜像站https://mirrors.tuna.tsinghua.edu.cn/ 从里面下载ubuntu-22.04-desktop-amd64.iso UltraISO是一款非常不错的U盘启动盘制作工具&#xff0c;一直被许多网友们所喜欢&#xff0c;使用简单、方便。 UltraISO官方下载地址&#xff1a;https://cn.ultrais…

5年经验之谈 —— 为什么要做自动化测试?

自动化测试是一种软件测试方法&#xff0c;通过编写和使用自动化脚本和工具&#xff0c;以自动执行测试用例并生成结果 自动化旨在替代手动测试过程&#xff0c;提高测试效率和准确性 自动化测试可以覆盖多种测试类型&#xff0c;包括功能测试、性能测试、安全测试等&#xf…

网工内推 | 网络工程师,NP认证优先,上市公司,包吃,最高15薪

01 无锡先导智能装备股份有限公司 招聘岗位&#xff1a;高级网络工程师 职责描述&#xff1a; 1.依据项目规划方案提供硬件及网络方案设计&#xff1b; 2.面向客户提供网络技术支持&#xff0c;包括故障的解决、性能的优化、日常维护等&#xff1b; 3.和合作伙伴、供应商的技术…

NLP论文阅读记录 - 2021 | RefSum:重构神经总结

文章目录 前言0、论文摘要一、Introduction1.1目标问题1.2相关的尝试1.3本文贡献 二.前提堆叠重新排序 三.本文方法3.1 总结为两阶段学习3.1.1 基础系统3.1.2 元系统 3.2 重构文本摘要3.2.1 重构3.2.2 预训练重构3.2.3 微调重构3.2.4 应用场景3.2.4.1 重构为基础学习者3.2.4.2 …

Vue学习计划-Vue3--核心语法(一)OptionsAPI、CompositionAPI与setup

1. OptionsAPI与CompositionAPI Vue2的API设计是Options(配置)风格的Vue3的API设计是Composition(组合)风格的 Options API的弊端&#xff1a; Options类型的API&#xff0c;数据、方法、计算属性等&#xff0c;是分散在&#xff1a;data、methods、computed中的&#xff0c;若…

【Linux Shell】1. Shell 简述

文章目录 【 1. Shell 解释器、Shell语言、Shell脚本 】【 2. Shell 环境 】【 3. 一个简单的 Shell 脚本 】3.1 Shell 脚本的编写3.2 Shell 脚本的运行3.2.1 作为可执行程序运行 Shell 脚本3.2.2 作为解释器参数运行 Shell 脚本 【 1. Shell 解释器、Shell语言、Shell脚本 】 …

正则表达式 详解,10分钟学会

大家好&#xff0c;欢迎来到停止重构的频道。 本期我们讨论正则表达式。 正则表达式是一种用于匹配和操作文本的工具&#xff0c;常用于文本查找、文本替换、校验文本格式等场景。 正则表达式不仅是写代码时才会使用&#xff0c;在平常使用的很多文本编辑软件&#xff0c;都…

华为月薪25K的自动化测试工程师到底要会那些技能!

​前言 3年自动化测试软件测试工程师职业生涯中&#xff0c;我所经历过的项目都是以自动化测试为主的。由于自动化测试是一个广泛的领域&#xff0c;我将自己的经验整理了一下分享给大家&#xff0c;话不多说&#xff0c;直接上干货。 自动化测试的目标和实践选择合适的自动化…

2023 年博客总结

当无所事事&#xff0c;没有多少收获的时候&#xff0c;时间过得格外的快… 当充实有为&#xff0c;经常有收获有进步的时候&#xff0c;才觉得时间没有浪费… 2023年收获不多… 以前说孩子小&#xff0c;需要照顾所以没时间&#xff0c;我以为孩子大点就有时间了&#xff0c;…

Plantuml之甘特图语法介绍(二十八)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 优质专栏&#xff1a;多媒…

QML —— Canvas重绘钟表组件(附完整源码)

示例效果] 源码 main.cpp #include <QGuiApplication> #include <QQmlApplicationEngine>int main(int argc, char *argv[]) {QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);QGuiApplication app(argc, argv);QQmlApplicationEngine engine;const…

自动化测试框架 —— pytest框架入门到入职篇

01、pytest框架介绍 pytest 是 python 的第三方单元测试框架&#xff0c;比自带 unittest 更简洁和高效&#xff0c;支持非常丰富的插件&#xff0c;同时兼容 unittest 框架。这就使得我们在 unittest 框架迁移到 pytest 框架的时候不需要重写代码。 pytest框架优点 1、简单…