多态(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 ...
随机推荐
- iOS-工厂模式
概述 在前面两章中,分别介绍了简单工厂模式和工厂方法模式,我们知道简单工厂模式的优点是去除了客户端与具体产品的依赖,缺点是违反了“开放-关闭原则”:工厂方法模式克服了简单工厂模式的缺点,将产品的创建工 ...
- VMware Workstation cannot connect to the virtual machine 解决方案
今天 打开虚拟机 忽然遇到这个问题: VMware Workstation cannot connect to the virtual machine. Make sure you have righ ...
- 使用动态类型dynamic让你的省了很多临时类
客户端与服务端的数据交互使用的数据格式是json格式,为了使客户端与服务端有类对应关系,进行序列化,所以总要定义一些类,使用动态类型dynamic可以不必要定义那么多类. 测试代码: using Sy ...
- inoic start projectname sidemenu报错 - Error: Cannot find module 'lodash._baseslice'
inoic start projectname sidemenu报错 - Error: Cannot find module 'lodash._baseslice' 在公司的电脑上出现过这个错误,后来 ...
- Java EE开发平台随手记6——Mybatis扩展4
这篇博客中来说一下对Mybatis动态代理接口方式的扩展,对于Mybatis动态代理接口不熟悉的朋友,可以参考前一篇博客,或者研读Mybatis源码. 扩展11:动态代理接口扩展 我们知道,真正在My ...
- Cocos2d-x 3.2 学习笔记(四)学习打包Android平台APK!
从cocos2dx 3.2项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭建一次之后,以后就会非常快捷! (涉及到3.1.1版本的,请自动对应3.2版本,3.x版本的环境搭建都是一样的) ...
- 邻接表有向图(一)之 C语言详解
本章介绍邻接表有向图.在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了.和以往一样,本文会先给出C语言的实现:后续再分别给出C++和Java版本的实现 ...
- [转载]UML类图总结
前言 类图和序列图是UML中最常用的两种Diagram.我将做详细的总结.在许多书中,或者网站中,在介绍一个系统的子系统的设计时,很多时候,都是给出简单的类图来简述构成子系统的类之间的关系.这足以说明 ...
- Arctext.js - 基于 CSS3 & jQuery 的文本弯曲效果
Arctext.js 是基于 Lettering.js 的文本旋转插件,根据设置的旋转半径准确计算每个字母的旋转弧度并均匀分布.虽然 CSS3 也能够实现字符旋转效果,但是要让安排每个字母都沿着弯曲路 ...
- [software development] 需求分析checklist
[software development] 需求分析checklist // */ // ]]> [software development] 需求分析checklist Table of ...