C++多态(虚函数,纯虚函数,抽象类)

一.多态

1.理解:

多种形态,多种形式

eg:多个派生类均把基类的方法run重新实现,但是实现的方式不同,体现了多种形式,即为多态

2.分类

(1)编译时的多态:在编译过程中确定了同名操作的具体操作对象;

(2)运行时的多态:程序运行过程中才动态地确定操作所针对的对象;

3.联编

是确定操作的具体对象的过程——把一个标识符名和存储地址联系在一起的过程;

联编:把一条消息和一个对象的方法结合的过程;

根据进行的截断的不同,可以分为:静态联编和动态联编;

静态联编——编译时多态性——函数重载和运算符重载

动态链表——运行时多态性——虚函数

二.函数重载

函数的重载也称多态函数:使得程序能用同一个名字来访问一组相关的函数,提高程序的灵活性

函数名相同,但是函数所带的参数的个数或者数据类型不同;——编译器根据参数决定调用哪个

1.形式:(1)参数个数或类型有所差别;(2)参数完全相同但属于不同的类

主要谈参数完全相同,但是属于不同的类;

方法:用对象名区别或者用类名和范围解析运算符区别

eg:Point pob(15,15)

pob.area()         Point::area()

三.虚函数

虚函数实现的是动态的重载;函数调用与函数体之间的联系是在运行时建立的;动态联编

1.定义虚函数

在基类中进行,把基类中需要定义为虚函数的成员函数声明为virtual

基类中的某个成员函数被声明为虚函数后,就可以在派生类中重新定义。在派生类中重新定义时,其函数原型包括返回类型,函数名,参数个数和类型,参数的顺序都必须与基类中的原型完全一致

(指向派生类对象的指针,不能指向私有派生类的对象;当指向公有派生类的对象是只能直接访问派生类中从基类继承下来的成员不能直接访问公有派生类中定义的成员;)

注意事项:

(1)虚函数的声明只能出现在类函数原型的声明中,不能出现在函数实体实现时;

(2)基类中只有保护成员或公有成员才能被声明为虚函数;

(3)在派生类中重新定义虚函数时,关键字virtual可写可不写

(4)动态联编只能通过成员函数来调用或通过指针,引用来访问虚函数

四。多级继承和虚函数

多级继承的虚函数与单继承的虚函数的调用相同。不同类创建的对象调用的函数是不一样的;

class Base
{
public:virtual void func(){cout << "Base output" << endl;}
};class Derived1 :public Base
{
public:void func(){cout << "Derived output!" << endl;}
};class Derived2 :public Derived1
{
public:void func(){cout << "Derived2 output!" << endl;}
};void test(Base& b)
{b.func();
}int main()
{Base bObj;Derived1 d1Obj;Derived2 d20bj;//当把基类中的virtual去掉之后,再次运行程序,此时的结果为:只是Base outputtest(bObj);test(d1Obj);test(d20bj);}

五.纯虚函数和抽象类

抽象类:包含纯虚函数的特殊的类;

建立抽象类是为了多态的使用抽象类的成员函数;

1.纯虚函数

在当前的基类中不能为虚函数给出一个有意义的实现时,可将其声明为纯虚函数;纯虚函数的实现留给派生类来完成,纯虚函数的作用是为派生类提供一个一致的接口;

一般来说:一个抽象类至少有一个纯虚函数;

纯虚函数的定义:

virtual<函数类型><函数名>(参数表)=0;

virtual void set()=0;//在这里并不表示返回值为0,只是起到形式上的作用,告诉编译器它是纯虚函数,说明在基类中不用定义该函数的函数体;

2.抽象类

包含纯虚函数的一种特殊的类,是为了抽象和设计而建立的;并且抽象类是不能创建对象的, 为了强调一个类是抽象类,可以将该类的构造函数声明为保护的访问控制权限;

只做子类的共同的操作接口;

抽象类只能用做其他类的基类,不能创建抽象类的对象;不能用作参数类型,函数的返回类型或显式转换的类型;

struct IDraw
{virtual void draw() = 0;
};struct ISize
{virtual void getSize(int& w, int& h) = 0;
};class Shape :public ISize, public IDraw
{};class Circle :public Shape
{
private:int m_x, m_y, m_r;
public:Circle(int x, int y, int r);void draw();void getSize(int& w, int& h);
};Circle::Circle(int x, int y, int r) :m_x(x), m_y(y), m_r(r)
{;
}
void Circle::draw()
{cout << "Draw a circle" << endl;
}void Circle::getSize(int& w, int& h)
{w = 2 * m_r;h = 2 * m_r;
}int main()
{Circle circle(0, 0, 123);IDraw* pDraw = &circle;pDraw->draw();ISize* pSize = &circle;int w = 0, h = 0;pSize->getSize(w, h);cout << "Width:" <<w<< endl;cout << "Height:" << h << endl;return 0;
}

通过上述例子:我们可以声明抽象类的对象指针或者引用,上述:IDraw*pDraw;就可以通过这个指针或者引用来访问派生类的对象成员

(在这里说明:C++中,结构体和类几乎是相同的,主要区别在默认的访问权限,类默认为私有的,而结构体默认为公有的,除了上述区别之外,;类可以继承自结构体,结构体也可以继承自类或者其他结构体,并且结构体中,我们经常定义接口(一组相关的纯虚函数),类可以从这些接口结构体继承,以实现这些接口,就比如上述:IDraw中的draw就为纯虚函数)


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

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

相关文章

Java中的代码优化与重构策略

Java中的代码优化与重构策略 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 1. 引言 代码优化与重构在软件开发中扮演着至关重要的角色。优秀的代码不仅令人…

将游戏降权运行 2024年,防止游戏检测,泄漏个人隐私

不得不说&#xff0c;现在的游戏&#xff0c;胆子是真的越来越大了。很多都带了个启动器&#xff0c;你开着游戏的时候他就给他开多了1个扫描器&#xff0c;看下你有没看一些小孩不宜的&#xff0c;玩游戏不宜打开的软件什么的&#xff0c;包括你的MAC地址啊&#xff0c;你当前…

pydub、ffmpeg 音频文件声道选择转换、采样率更改

快速查看音频通道数和每个通道能力判断具体哪个通道说话&#xff1b;一般能量大的那个算是说话 import wave from pydub import AudioSegment import numpy as npdef read_wav_file(file_path):with wave.open(file_path, rb) as wav_file:params wav_file.getparams()num_cha…

量化交易:金融投资的新篇章

在金融投资的世界里&#xff0c;量化交易正逐渐成为一股不可忽视的力量。它以数据驱动和算法决策为特点&#xff0c;为投资者提供了一种全新的交易方式。本文将深入探讨量化交易的基本概念、优势、挑战以及如何开始使用量化交易策略。 量化交易的定义与起源 量化交易&#xf…

Android10以上实现获取设备序列号功能

Android10以上实现获取设备唯一标识&#xff0c;目前只支持华为和荣耀设备。实现原理&#xff1a;通过无障碍服务读取序列号界面。 public class DeviceHelper implements Application.ActivityLifecycleCallbacks {static final String TAG "WADQ_DeviceHelper";s…

Zoom使用的基本步骤和注意事项

Zoom是一款功能强大的视频会议软件&#xff0c;广泛应用于远程办公、在线教育、团队协作等多个场景。以下是Zoom使用的基本步骤和注意事项&#xff1a; 一、注册与登录 注册Zoom账户&#xff1a; 访问Zoom官方网站&#xff08;如zoom.us&#xff09;&#xff0c;点击“注册”…

Android Enable 和clickable

setEnabled 使能控件 设置为false&#xff0c;该控件永远不会活动&#xff0c;不管设置为什么属性&#xff0c;都无效&#xff1b; 设置为true&#xff0c;表明激活该控件&#xff0c;控件处于活动状态&#xff0c;处于活动状态&#xff0c;就能响应事件了&#xff0c;比如触摸…

mybatis实现动态sql

第一章、动态SQL MyBatis 的强大特性之一便是它的动态 SQL。如果你有使用 JDBC 或其它类似框架的经验&#xff0c;你就能体会到根据不同条件拼接 SQL 语句的痛苦。例如拼接时要确保不能忘记添加必要的空格&#xff0c;还要注意去掉列表最后一个列名的逗号。利用动态 SQL 这一特…

2024北京大健康展,北京健康生活产品展览会十月举办

2024北京健博会&#xff0c;立足北京&#xff0c;效应辐射全国买方市场&#xff0c;助力健康中国事业建设&#xff1b; 2024第11届中国&#xff08;北京&#xff09;国际大健康产业博览会 The 2024 China (Beijing) International Health Service Expo 时间&#xff1a;2024年…

华为 RIP 协议中 RIP 兼容版本、RIPv1、RIPv2 在收发 RIP 报文时的区别

华为 RIP 协议中 RIP 兼容版本、RIPv1、RIPv2 的区别 为了更好地支持实际环境中路由器对 RIP 的支持&#xff0c;华为 VRP 平台具有一个兼容版本&#xff0c;默认情况下启动 RIP 进程后&#xff0c;如果没有配置 RIP 版本&#xff0c;该版本就为兼容版本&#xff0c;对 versio…

[ C++ ] 深入理解模板( 进 阶 )

目录 非类型模板参数 类模板没有实例化的情况 模板的特化 注意函数特化中遇到的问题 建议&#xff1a;&#xff08;直接使用函数重载&#xff09; 类模板特化 全特化 偏特化 偏特化有以下两种表现方式&#xff1a; 部分特化&#xff08;将模板参数类表中的一部分参数特化…

vue this.$refs加变量名

想动态获取$refs&#xff0c;我们可以用模板字符串来动态绑定ref的值。代码如下&#xff1a; this.$refs[${this.treeQueFlag}].setCheckedNodes([]); $refs后面拼变量&#xff0c;vue动态给$refs赋值_vue ref动态赋值-CSDN博客

旅游系统(附管理端+前台)PHP源码

一. 前言 今天小编给大家带来了一款可学习&#xff0c;可商用的&#xff0c;旅游系统 源码&#xff0c;支持二开&#xff0c;无加密。支持景点管理&#xff0c;登录&#xff0c;景点预定&#xff0c;意见反馈&#xff0c;统计等功能。详细界面和功能见下面视频演示。 二. 视频…

【flutter问题记录】 无效的源发行版:17

问题描述 在看开源项目的时候&#xff0c;clone下来后一直编译失败&#xff0c;提示&#xff1a;无效的源发行版:17&#xff0c;看描述大概是jdk的版本问题&#xff0c;但是在Android studio各种指定都无用&#xff0c;网上资料也没有flutter项目的解决方案&#xff0c;最后在…

在Spring MVC框架中,如何处理HTTP请求和响应?

在Spring MVC框架中&#xff0c;HTTP请求和响应的处理是通过一系列组件和流程来完成的。以下是Spring MVC处理HTTP请求和响应的主要步骤&#xff1a; 用户发起请求&#xff1a; 用户在客户端&#xff08;如浏览器&#xff09;上发起一个HTTP请求&#xff0c;这个请求被发送到服…

广州自闭症机构哪家好?

在广州&#xff0c;众多的自闭症康复机构中&#xff0c;星贝育园自闭症儿童康复学校以其独特的优势脱颖而出。 一、专业的师资团队 我们拥有一支经验丰富、专业素养极高的师资队伍。每位老师都经过严格的专业培训&#xff0c;深入了解自闭症儿童的特点和需求。他们不仅具…

深入挖掘海外快手kwai ads推广巴西slots手游广告独家优势

深入挖掘海外快手kwai ads推广巴西slots手游广告独家优势 在数字化时代&#xff0c;广告投放已成为各行各业不可或缺的一部分&#xff0c;特别是在游戏行业&#xff0c;如何有效地推广游戏产品&#xff0c;吸引玩家的眼球&#xff0c;成为了每一个游戏开发商和广告主所关注的焦…

假设性文档嵌入 HyDE:大模型 + 对比学习,从关键词相似度搜索到语义搜索

假设性文档嵌入 HyDE&#xff1a;大模型 对比学习&#xff0c;从关键词相似度搜索到语义搜索 提出背景流程图解法拆解类比1. 单一文档嵌入空间的搜索2. 指令跟随型语言模型&#xff08;InstructLM&#xff09;的引入3. 生成文档的嵌入编码 提出背景 论文&#xff1a;https://…

python怎么样将一段程序无效掉

1、python中可以用注释屏蔽一段语句&#xff0c;具体方法如下&#xff0c;首先打开一段python的示例程序&#xff1a; 2、然后单行注释的方法是在语句前面加上#&#xff0c;程序运行后添加注释的地方的语句会被自动跳过&#xff0c;这里可以看到将打印变量a的语句添加注释就没有…