多态(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 ...
随机推荐
- Atitti usrQBf1801 翻页控件规范 v2
Atitti usrQBf1801 翻页控件规范 v2 1. 参考api 参考easyui ,.net系列的1 1.1. 翻页流程 初始化翻页控件,以及绑定新页面event onSelectPa ...
- Atitit hsv转grb 应该优先使用hsv颜色原则 方便人类
Atitit hsv转grb 应该优先使用hsv颜色原则 方便人类 1.1. 1.1.hsv色卡1 1.2. 从 HSV 到 RGB 的转换1 1.3. HSVtoRGBColorV22 1.1. ...
- Drupal网站开发实践系列
这一系列文章会记录我最近一个项目的开发历程.包括用到的模块,功能的具体实现,调用的API,还有主题的制作,一部分前端信息等. 该网站基于Drupal7+Commerce制作,主题部分基本完全自定义,没 ...
- poi 输出Excel显示内容
在业务系统中多少回接触到Excel解析.在java开发平台下选择 Apache POI是一个非常明智的选择,POI提供非常完善API来读取或写入Microsoft Office Excel. 目前对导 ...
- Nginx配置网站适配PC和手机
考虑到网站的在多种设备下的兼容性,有很多网站会有手机版和电脑版两个版本.访问同一个网站URL,当服务端识别出用户使用电脑访问,就打开电脑版的页面,用户如果使用手机访问,则会得到手机版的页面. 1.判断 ...
- Hadoop阅读笔记(四)——一幅图看透MapReduce机制
时至今日,已然看到第十章,似乎越是焦躁什么时候能翻完这本圣经的时候也让自己变得更加浮躁,想想后面还有一半的行程没走,我觉得这样“有口无心”的学习方式是不奏效的,或者是收效甚微的.如果有幸能有大牛路过, ...
- EasyUI笔记
以下功能实现朋友们若有更好的思路办法,欢迎留言交流. 1.关闭其他标签页(右键菜单触发,保留左侧第一个欢迎tab) 问题:取到的数组tabs长度会随着tab的关闭而变化 思路:先遍历需要关闭的标签页t ...
- Android反编译(二)之反编译XML资源文件
Android反编译(二) 之反编译XML资源文件 [目录] 1.工具 2.反编译步骤 3.重新编译APK 4.实例 5.装X技巧 6.学习总结 1.工具 1).反编译工具 apktool http ...
- 在springmvc中配置jedis:
主要学习https://github.com/thinkgem/jeesite.一下代码均参考于此并稍作修改. 1.jedis 首先,需要添加jedis: <!--jedis--> < ...
- 大M法(Big M Method)
前面一篇讲的单纯形方法的实现,但程序输入的必须是已经有初始基本可行解的单纯形表. 但实际问题中很少有现成的基本可行解,比如以下这个问题: min f(x) = –3x1 +x2 + x3 s.t. x ...