多态(RAW)
函数重写overwrite:当子类提供了和父类同名的虚函数时,称之为函数重写,函数的返回值类 函数名 参数列表必须完全相同
名字隐藏namehide:当子类提供了和父类同名的数据时 叫名字隐藏
函数重载:同一个作用域中 函数名相同 参数列表不同的函数构成重载
多态
当父类型的指针(引用)指向子类对象时,通过父类型的指针 调用虚函数,如果子类重写了这个虚函数,则调用的表现是子类的,否则就是父类型中对应的实现,多态使类型更加通用,根据具体的对象做出具体的行为
- 继承是构成多态的基础
- 虚函数是构成多态的关键
- 函数重写是必备条件
应用
用在函数的参数上
void testAnimal(Dog* dog); //不好
void testAnimal(Animal* dog); //好
用在函数的返回值上
Cat* getAnimal(int s); //不好
Animal* getAnimal(int s); //好
静态绑定:编译时确定调用的函数地址
动态绑定:运行时确定调用函数的地址
虚表虚指针
多态的底层实现,靠的是虚函数表(虚表),
虚指针,指向虚表的指针任何一个具有虚函数的类型 只有一张虚表 同类型的对象共享虚函数表,当一个父类型的指针指向一个子类型的对象时,调用虚函数时并没有立即生成函数的调用地址,而是先根据对象定位出对象的前4byte对象的虚函数表,再根据虚函数表中存放的函数地址进行调用,虚函数表中存放的是哪个函数,对应哪个类的实现,就调用相应的函数
类型识别
Q为什么要有类型识别
A:多态做到的效果是类型通用,但这样损失了对象的个性,有时候要恢复个性,根据具体的类型做出相应的个性展现
dynamic_cast<类型>(对象) //会尝试着把对象变成相应的类型,如果成功就返回非空,不成功就返回NULL
typeid
这个运算符可以获得类型或者对象的类型信息, typeid返回的信息存入一个type_info类型的对象中,这个类型重载==和!=运算符,并且有个成员函数name()返回类型的名称
/usr/include/c++/4.6 下有一个头文件#include
抽象类
不能实例化的类,除此之外和正常没有区别,只要在类中出现一个纯虚函数(pure),这个类就是抽象类
class A{
public:
virtual void show()=0; //纯虚函数
};
Note:如果一个类继承了抽象类,但没有实现其中的纯虚函数,那么这个子类也会变成抽象类
虚析构函数
加了virtual修饰的析构函数,当父类对象的指针指向子类对象时,如果释放指针对应的内存,只会调用父类对应的析构函数,子类析构行为未定义(不去调用)
如果把父类对应的析构函数改成虚析构,则会调用子类析构函数,同时由于子类的析构函数的调用必然会触发父类析构函数的调用,上述问题得以解决
Q:什么时候需要虚析构
A:当父类中有虚函数(此时常常需要用父类型对象指向子类型对象以实现多态)或者父子类型中都有堆内存处理,需要使用虚析构来释放资源
多态(RAW)的更多相关文章
- windows服务 MVC之@Html.Raw()用法 文件流的读写 简单工厂和工厂模式对比
windows服务 public partial class Service1 : ServiceBase{ System.Threading.Timer recordTimer;public S ...
- GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级
一.使用Raw文件夹下的数据库文件 在使用GreenDao框架时,数据库和数据表都是根据生成的框架代码来自动创建的,从生成的DaoMaster中的OpenHelper类可以看出: public sta ...
- EntityFramework Core Raw SQL
前言 本节我们来讲讲EF Core中的原始查询,目前在项目中对于简单的查询直接通过EF就可以解决,但是涉及到多表查询时为了一步到位就采用了原始查询的方式进行.下面我们一起来看看. EntityFram ...
- Java中的多态
1.多态:具有表现多种形态的能力的特征 父类: public abstract class Animal {public abstract void Say();} 子类: public class ...
- Android raw to bmp
Android raw 格式转 bmp 图像 raw 保存的为裸数据,转换时都需要把它转成RGBA 的方式来显示.其中: 8位RAW: 四位RGBA 来表示一位灰度; 24位RAW: 三位RGB相同, ...
- C# 工厂模式+虚方法(接口、抽象方法)实现多态
面向对象语言的三大特征之一就是多态,听起来多态比较抽象,简而言之就是同一行为针对不同对象得到不同的结果,同一对象,在不同的环境下得到不同的状态. 实例说明: 业务需求:实现一个打开文件的控制台程序的d ...
- C#非常重要基础之多态
前几天看了一位同志的博客,写的是关于他自己去支付宝面试的经历.过程大体是这样的:问答的时候,前面部分,作者都应答如流,说起自己经验如何之丰富,最后面试官问了作者一个问题:请简述多态的概念和作用.结果这 ...
- C++多态详解
多态是面向对象的程序设计的关键技术.多态:调用同一个函数名,可以根据需要但实现不同的功能.多态体现在两个方面,我们以前学过的编译时的多态性(函数重载)和现在我们这一章将要学习的运行时的多态性(虚函数) ...
- 【那些年关于java多态应用】
1.多态:具有表现多种形态的能力的特征 父类: public abstract class Animal { public abstract void Say();} 子类: public class ...
随机推荐
- 快速入门系列--MVC--07与HTML5移动开发的结合
现在移动互联网的盛行,跨平台并兼容不同设备的HTML5越来越盛行,很多公司都在将自己过去的非HTML5网站应用渐进式的转化为HTML5应用,使得一套代码可以兼容不同的物理终端设备和浏览器,极大的提高了 ...
- 在configure distribution时遇到错误,不能打开sql agent
今天在配置Distribution时,遇到一个错误,不能打开sql agent,详细错误信息如下: SQL Server blocked access to procedure 'dbo.sp_set ...
- javascript中关于日期和时间的基础知识
× 目录 [1]标准时间 [2]字符串 [3]闰年[4]月日[5]星期[6]时分秒 前面的话 在介绍Date对象之前,首先要先了解关于日期和时间的一些知识.比如,闰年.UTC等等.深入了解这些,有助于 ...
- The Triumph Of Bio-logic
理性技术的局限 机械逻辑 人造机械的构成逻辑,比如说钟表的制作原理.是一种可被人类掌握的,可推演的理论. 生物逻辑 一个有机系统的构成逻辑.比如说草原.细胞.大脑等这些系统的存在所依托的逻辑,我们成为 ...
- Java多线程系列--“JUC线程池”05之 线程池原理(四)
概要 本章介绍线程池的拒绝策略.内容包括:拒绝策略介绍拒绝策略对比和示例 转载请注明出处:http://www.cnblogs.com/skywang12345/p/3512947.html 拒绝策略 ...
- javaWeb之maven多数据库环境的配置信息
在使用maven构建的web项目里,不管采用的是什么orm框架,数据库写死了必然不是最灵活的方式.所以通过maven 的buid方式可以动态的分配数据库信息 比如在jdbc.properties中,可 ...
- Hover.css:一组超实用的 CSS3 悬停效果和动画
Hover.css 是一套基于 CSS3 的鼠标悬停效果和动画,这些可以非常轻松的被应用到按钮.LOGO 以及图片等元素.所有这些效果都是只需要单一的标签,必要的时候使用 before 和 after ...
- Windows Azure HandBook (10) 测试本地网络到微软云的延迟
<Windows Azure Platform 系列文章目录> 之前遇到一些微软云的客户,在使用海外数据中心的时候,需要评估本地网络到微软云网络的延迟. 我们建议部署到微软云上的服务,离最 ...
- java并发编程实践学习(2)--对象的组合
先验条件(Precondition):某些方法包含基于状态的先验条件.例如,不能从空队列中移除一个元素,在删除元素前队列必须处于非空状态.基于状态的先验条件的操作成为依赖状态操作. 在单线程中,如果某 ...
- 【手把手教你全文检索】Lucene索引的【增、删、改、查】
前言 搞检索的,应该多少都会了解Lucene一些,它开源而且简单上手,官方API足够编写些小DEMO.并且根据倒排索引,实现快速检索.本文就简单的实现增量添加索引,删除索引,通过关键字查询,以及更新索 ...