C++中对多态的理解

1 多态:是指类中具有相似功能的不同函数,使用同一个名称来实现;是对类的行为再抽象;多态是通过重载函数和虚函数来实现的。
2 继承讨论的是类与类的层次关系,多态则是考虑在不同层次的类中,以及在同一个类的内部,同名成员函数之间的关系问题,是解决功能和行为的再抽象问题。
3 多态是指类族中具有相似功能的不同函数使用同一个名称来实现,从而可以使用相同的调用方式来调用这些具有不同功能的同名函数。
类型:
面向对象的多态性可以分为4类:
专用多态:
(1)重载多态:普通函数以及成员函数的重载。
(2)强制多态:将一个变量的类型加以变化。
通用多态:
(3)包含多态:研究类族中定义于不同类中的同名成员函数的多态行为,主要通过虚函数来实现。
(4)参数多态:与类模板相关联。
实现:
多态从实现的角度可以分为:
(1)编译时的多态:静态联编(重载、强制、参数),程序编译连接阶段完成。
(2)运行时的多态:动态联编(包含),程序运行阶段完成。
联编:是指计算机程序自身彼此关联的过程,就是把一条消息和一个对象的方法相结合的过程。
运算符重载:
运算符重载的实质是函数重载,在实现过程中,首先把指定的运算表达式转化为对运算符函数的调用,运算对象转化为运算符函数的形参,然后根据实参的类型来确定需要调用的函数,这个过程是在编译过程中实现的。不能重载的运算符有5个:“.”,“*”,“::”,“? :”“sizeof”。
虚函数:
虚函数是动态联编的基础,虚函数是非静态成员函数,虚函数经过派生之后,在类族中可以实现运行过程中的多态。
根据赋值兼容规则,可以使用派生类对象代替基类对象。如果用基类类型的指针指向派生类对象,就可以通过这个指针来访问该对象。问题是派生到的只是从基类继承来的同名成员。
解决这一问题的办法就是:如果需要通过基类的指针指向派生类的对象,并访问某个与基类同名的成员(如果是函数,则原型完全相同)。那么,首先在基类中将这个同名函数说明为虚函数。
这样,通过基类类型指针,就可以使属于不同派生类的不同对象产生不同的行为,从而实现运行过程中的多态。
一般虚成员函数实现的3个条件:
(1)首先类之间应满足赋值兼容规则。
(2)声明虚函数。
(3)由成员函数调用,或者通过指针、引用来访问虚函数。
如果使用对象名来访问虚函数,则联编在编译过程中就可以通过(静态联编),而无需在运行中进行。
虚析构函数:
如果一个类的析构函数时虚函数,那么,用它派生而来的所用子类的析构函数也是虚函数。析构函数设置为虚函数之后,在使用指针,引用时就可以动态联编,实现运行时的多态,保证使用基类类型的指针就能够调用适当的析构函数针对不同的对象进行清理工作。
抽象类:
(1)抽象类是一种特殊的类,它为一族类提供统一的操作界面,通过它为一个类族建立一个公共的接口,使类能够更加有效的发挥多态性。
(2)建立抽象类,就是为了通过它多态地使用其中的成员函数。
(3)抽象类处于其层次的上层,一个抽象类自身无法实现化,而只能通过继承机制。生成抽象类的非抽象派生类,然后实例化。但是,可以声明一个抽象类的指针和引用。
(4)抽象类是带有纯虚函数的类。
(5)抽象类派生出新类之后,如果派生类没有给出全部纯虚函数的实现,这时的派生类仍是一个抽象类。
(6)纯虚函数:virtual 函数类型 函数名(参数表)=0;

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

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

相关文章

C#.NET中的事件2

/** Created by SharpDevelop. * User: noo * Date: 2009-8-17 * Time: 15:34 * * 事件2 */usingSystem ;usingSystem .Windows .Forms ;classTest { staticvoidMain()//入口函数{ Form frmnewForm ();//新建一窗体frm.Text "我的窗体"; …

HTML学习之基础

HTML是网页的标记语言不是编程语言&#xff0c;有一些标记段组成。大小写不敏感&#xff0c;可以用常用的编辑器软件编写用浏览器打开即可 有不同的版本<!DOCTYPE html> <meta charset"utf-8">在<title>前为了能正常显示中文。 超链接&#xff1a;…

linux最基础的几个指令

cd 切换目录使用 pwd 显示当前目录路径 ls 列出目录内容 跟参数 -a 显示所有文件和目录 -A 显示所有文件包括隐藏-l 使用详细格式列出-d 显示目录名称而非内容-i 显示文件和目录的inode号-Z 显示文件和目录的上下文-R 子目录显示touch 创建文件或者改变文件时间 touch 2…

Advapi 登录类型8的错误

登录类型8&#xff1a;网络明文&#xff08;NetworkCleartext&#xff09; 这种登录表明这是一个像类型3一样的网络登录&#xff0c;但是这种登录的密码在网络上是通过明文传输的&#xff0c;WindowsServer服务是不允许通过明文验证连接到共享文件夹或打印机的&#xff0c;据我…

Varint

什么是Varint Varint 是一种紧凑的表示数字的方法。它用一个或多个字节来表示一个数字&#xff0c;值越小的数字使用越少的字节数。这能减少用来表示数字的字节数。 比如对于 int32 类型的数字&#xff0c;一般需要 4 个 byte 来表示。但是采用 Varint&#xff0c;对于很小的 …

Ubuntu 17.10安装Qt 5.10环境与Qt Creator 4.5开发工具(转自linux公社)

记录下在Ubuntu 17.10搭建Qt环境与安装Qt Creator开发工具的过程。机器装的Linux是Ubuntu 17.10&#xff0c;16.04与17.04的应该也相同。Qt 5.10和Qt 3D Studio发布 http://www.linuxidc.com/Linux/2017-12/149267.htm 1&#xff0c;Qt安装 1.1 下载Qt 这里提供Qt Creator的下…

服务器USB启动故障一例

前几日&#xff0c;本公司一台prop平台服务器&#xff08;hp 380G5服务器&#xff09;接上key&#xff08;usb口&#xff09;后&#xff0c;出现重启不能启动现象&#xff0c;进入服务器bios设置启动项为硬盘启动也不行&#xff0c;之后仔细查看服务器usb控制选项&#xff1a;可…

C#基础(201)--常量枚举

本文知识点&#xff1a; 1.掌握常量的定义和使用方法 2.理解枚举的作用和特点 3.掌握枚举的使用方法 1.1.常量的定义语法 const 数据类型 常量名称 值&#xff1b; 1.2.常见错误 1.3常量的使用时机 经常使用并且值不变的变量&#xff0c;可以定义为常量 2.1枚举的作用及其…

自定义EL函数解决JSTL标签不足之处——按字节长度截取字符串

题外话&#xff1a;做过大型网站前台的Web开发程序员最头疼的事情就是前台首页的布局&#xff0c;这其中最最头疼的就是标题字符的截取的问题&#xff0c;虽然有fn:substring&#xff0c;但表现率以及对中文的支持均不够完善&#xff0c;其实最终还是归结为客户要求太高了&…

进程之父子进程的关系

转载&#xff1a;https://blog.csdn.net/qq_28840229/article/details/79844763 fork之后&#xff1a; 父子相同处: 全局变量、.data、.text、栈、堆、环境变量、用户ID、宿主目录、进程工作目录、信号处理方式... 父子不同处: 1.进程ID 2.fork返回值 3.父进程ID 4.进…

C语言快速排序算法

void sort(int *a, int left, int right) {if(left > right)/*如果左边索引大于或者等于右边的索引就代表已经整理完成一个组了*/{return ;}int i left;int j right;int key a[left];while(i < j) /*控制在当组内寻找一遍*/{while(i &l…

unbuntu使用经典界面

为什么80%的码农都做不了架构师&#xff1f;>>> 昨天升级到UBUNTU 11.04, 发现新的Unity界面很不适应&#xff0c;于是将其恢复到旧式经典界面&#xff0c;具体操作模式方法如下&#xff1a; 在已经登录的状态下&#xff0c;选择 [注销]然后在重新登录的时候&#…

学习:深入浅出之正则表达式(转)

本文是Jan Goyvaerts为RegexBuddy写的教程的译文&#xff0c;版权归原作者所有&#xff0c;欢迎转载。但是为了尊重原作者和译者的劳动&#xff0c;请注明出处&#xff01;谢谢&#xff01; 1. 什么是正则表达式 基本说来&#xff0c;正则表达式是一种用来描述一定数量文本…

C语言判断计算机存储是大端还是小端

计算机的一个int型数据是用多个字节表示的&#xff0c;如果在内存中存放时标称该数据的地址中存放的是数据的最低字节&#xff0c;就叫小端机&#xff0c;反之把高字节存放在标称地址中的则称为大端机。所以可以定义一个int变量&#xff0c;将其地址强制为char *型地址&#xf…

服务器开发中网络数据分析与故障排查经验漫谈

转载大牛的文章&#xff1a; https://mp.weixin.qq.com/s/6ZmiKUz4ZQvwLXkzzBrFcg

每天干的啥?(2019.3)

【本年目标】 【本月目标】【本月总结】 【3月每日记录】 去洗照片24张9寸&#xff0c;研究手机root&#xff08;y66不支持啊&#xff09;&#xff0c;下午党学习照相、看完第4课blake《用户数据ugame》、研究轮滑gif、晚上钢琴首次调律。 去妈妈那吃饭&#xff0c;学钢琴、佰洲…

【Andorid X 项目笔记】禁用ListView的Fling功能(1)

前言新的项目正在紧张开发中&#xff0c;初步估计2个月时间开发完成第一版&#xff0c;我负责Android端开发&#xff0c;由于不便过早公布&#xff0c;本系列将命名为“X项目笔记”&#xff0c;并于项目结束后最终公布名称。本系列主要记录与分享"X项目"中遇到的问题…

C语言题目地图上有m个城市,序号依次为1,2,3....m,刚开始你在1,若每次只能从当前城市去往当前序号加1或者加3的城市,要到达m城市(m3),有多少种走法

地图上有m个城市&#xff0c;序号依次为1,2,3....m&#xff0c;刚开始你在1&#xff0c;若每次只能从当前城市去往当前序号加1或者加3的城市&#xff0c;要到达m城市&#xff08;m>3&#xff09;,有多少种走法 要想到达m&#xff0c;则前一个应该是m - 1或者m -3&#xff1b…

Java IO/NIO教程

Java IO教程 http://tutorials.jenkov.com/java-io/index.html Java NIO教程 英文版&#xff1a; http://tutorials.jenkov.com/java-nio/index.html 中文版: Java NIO概述Java NIO ChannelJava NIO BufferJava NIO Scatter / GatherJava NIO 通道之间的数据传输Java NIO Selec…

SQL Server 数据库管理常用的SQL和T-SQL语句

--按姓氏笔画排序:SELECT*FROM TableName ORDERBY CustomerName COLLATE Chinese_PRC_Stroke_ci_as--数据库加密:SELECT encrypt(原始密码)SELECT pwdencrypt(原始密码)SELECT pwdcompare(原始密码,加密后密码)1--相同&#xff1b;否则不相同 encrypt(原始密码)SELECT pwdencry…