C++学习笔记45:多态性
运算符重载
运算符是针对新类型数据的实际需要,对原有运算符进行适当的改造
1.比如使复数类的对象可以使用+运算符实现加法;
2.比如使时钟类的对象可以用++运算符实现时间增加1秒;
注意:可以重载为类的非静态成员函数、非成员函数
重载为类成员的运算符函数定义形式:
函数类型 operator 运算符(形参)
{
...
}
//参数个数=原操作数个数减1,(后置++,--除外)
如何重载运算符为非成员函数?
有些运算符不能重载为成员函数,例如二元运算符的左操作数不是对象,或者不能由我们重载运算符的对象;
备注:如果在重载运算符函数中要操作某类对象的私有成员,可以将此函数声明为该类的友元;
后置单目运算符的重载函数,形参列表中要增加一个int,但不必写形参名:
例如:
表达式 oprd B
等同于operator B(oprd,0)
虚函数:
通过虚函数实现运行时多态性,实现动态绑定;
虚函数必须是非静态的成员函数(属于对象的,而不是类的),虚函数经过派生后就可以实现运行过程中的多态;
注释:
一般的成员函数可以是虚函数;
构造函数不能是虚函数;
析构函数可以是虚函数;
虚函数一般不声明为内联函数,因为内联函数的处理是静态的;
虚析构函数
可能通过基类指针删除派生类的对象;如果需要通过基类指针调用对象的析构函数,就需要让基类的析构函数成为虚函数;
虚表与动态绑定
虚表
每个多态类都有一个虚表(virtual table)
虚表中有当前类的各个虚函数的入口地址
每个对象有一个指向当前类的虚表的指针(虚指针vptr)
动态绑定的实现
构造函数中为对象的虚指针赋值
通过多态类型的指针或者引用调用成员函数时,通过虚指针找到虚表,进而找到所调用的虚函数的入口地址;
通过该入口地址调用虚函数;
抽象类
纯虚函数的定义格式:
virtual 函数类型 函数名(参数表) = 0;
带有纯虚函数的类称为抽象类;
抽象类的作用:
抽象类为抽象和设计的目的而声明;
将有关的数据和行为组织在一个继承层次结构中,保证派生类具有要求的行为;
对于暂时无法实现的函数,可以声明为纯虚函数,留给派生类去实现;
C++11:override 与final
override
- 多态行为的基础:基类声明虚函数,继承类声明一个函数覆盖该虚函数
- 覆盖要求: 函数签名(signatture)完全一致
- 函数签名包括:函数名 参数列表 const
C++11引入显示函数覆盖,在编译期而非运行期捕获此类错误;在虚函数显示重载中运用,编译器会检查基类是否存在一虚函数,与派生类中带有声明override的虚函数,有相同的签名,若不存在则会报错;
final
C++11中提供的final,用来避免类被继承,或是基类的函数被改写;
C++学习笔记45:多态性的更多相关文章
- [原创]java WEB学习笔记45:自定义HttpFilter类,理解多个Filter 代码的执行顺序,Filterdemo:禁用浏览器缓存的Filter,字符编码的Filter,检查用户是否登陆过的Filter
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
- CUBRID学习笔记 45 REPLACE DELETE MERGE 教程
c#,net,cubrid,教程,学习,笔记欢迎转载 ,转载时请保留作者信息.本文版权归本人所有,如有任何问题,请与我联系wang2650@sohu.com . 过错 ------ 官方文档是英文的, ...
- Linux下汇编语言学习笔记45 ---
这是17年暑假学习Linux汇编语言的笔记记录,参考书目为清华大学出版社 Jeff Duntemann著 梁晓辉译<汇编语言基于Linux环境>的书,喜欢看原版书的同学可以看<Ass ...
- android学习笔记45——android的数据存储和IO
android的数据存储和IO SharedPreferences与Editor简介 SharedPreferences保存的数据主要是类似于配置信息格式的数据,因此其保存的数据主要是简单的类型的ke ...
- Java学习笔记45(多线程二:安全问题以及解决原理)
线程安全问题以及解决原理: 多个线程用一个共享数据时候出现安全问题 一个经典案例: 电影院卖票,共有100座位,最多卖100张票,买票方式有多种,网上购买.自主售票机.排队购买 三种方式操作同一个共享 ...
- 学习笔记45—Linux压缩集
1.压缩功能 安装 sudo apt-get install rar 卸载 sudo apt-get remove rar 2.解压功能 安装 sudo apt-get install unrar 卸 ...
- Android(java)学习笔记45:深入分析Java ClassLoader原理
1. 前言: Android中的动态加载机制能更好的优化我们的应用,同时实现动态的更新,这就便于我们管理我们的应用,通过插件化来减轻我们的内存以及CPU消耗,在不发布新版本的情况下能更新某些模块. 当 ...
- SAS学习笔记45 宏系统选项及其他
关于宏的系统选项 MCOMPILENOTE=NONE|NOAUTOCALL|ALL 该系统选项控制是否在日志当中显示宏程序编译时的信息,默认值为NONE,也就是不显示.其中NOAUTOCALL针对的是 ...
- Android学习笔记之JSON数据解析
转载:Android学习笔记44:JSON数据解析 JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,采用完全独立于语言的文本格式,为Web应用开发提供了一种 ...
随机推荐
- Python迷宫游戏(基础版)
# 画地图map_data = [ [1, 1, 1, 1, 1, 1, 1, 1, 1, 1], [1, 0, 1, 1, 1, 1, 1, 1, 1, 1], [1, 2, 1, 0, 0, 0, ...
- Encountered IOException running import job: org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://slaver1:9000/user/hadoop/tb_user already exists
1.当时初学Sqoop的时候,mysql导入到hdfs导入命令执行以后,在hdfs上面没有找到对应的数据,今天根据这个bug,顺便解决这个问题吧,之前写的http://www.cnblogs.com/ ...
- 17/11/24 05:08:44 WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
2017-11-24 21:20:25 1:什么叫失望,什么叫绝望.总之是一脸懵逼的继续...... 之前部署的hadoop都是hadoop-2.4.1.tar.gz,这几天换成了hadoop-2.6 ...
- 阿里 Goldeneye 四个环节落地智能监控:预测、检测、报警及定位
阿里 Goldeneye 四个环节落地智能监控:预测.检测.报警及定位 https://www.infoq.cn/article/alibaba-goldeneye-four-links
- CentOS安装CAS 5.3.4服务端
1.安装jdk1.8 https://www.cnblogs.com/kgdxpr/p/6824093.html 2.安装tomcat8 3.安装maven https://www.cnblogs.c ...
- Git坑换行符自动转换 [转载]
转自https://www.cnblogs.com/zjoch/p/5400251.html 源起 一直想在 GitHub 上发布项目.参与项目,但 Git 这货比较难学啊.买了一本<Git 权 ...
- javascript var变量删除
var有三种声明的情形: var声明的全局变量 var在函数范围内声明的局部变量 eval中声明的全局变量. 首先, 1.2种情形var声明的变量是无法删除的. 尽管var声明的全局变量是属于wind ...
- Inflated 3D ConvNet 【I3D】
Two-Stream Inflated 3D ConvNet (I3D) HMDB-51: 80.9% and UCF-101: 98.0% 在Inception-v1 Kinetics上预训练 Co ...
- EF 数据版本号,处理具体使用方法 RowVersion / Timestamp 使用方法。进行自动处理并发修改
/* * <div class="form-group"> // 原始 * <div class="form-group hidden"> ...
- 【Android】spannableStringBuilder
EditText: 通常用于显示文字,但有时候也需要在文字中夹杂一些图片,比如QQ中就可以使用表情图片,又比如需要的文字高亮显示等等,如何在android中也做到这样呢? 记得android中有个an ...