函数重写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)的更多相关文章

  1. windows服务 MVC之@Html.Raw()用法 文件流的读写 简单工厂和工厂模式对比

    windows服务   public partial class Service1 : ServiceBase{ System.Threading.Timer recordTimer;public S ...

  2. GreenDao 数据库:使用Raw文件夹下的数据库文件以及数据库升级

    一.使用Raw文件夹下的数据库文件 在使用GreenDao框架时,数据库和数据表都是根据生成的框架代码来自动创建的,从生成的DaoMaster中的OpenHelper类可以看出: public sta ...

  3. EntityFramework Core Raw SQL

    前言 本节我们来讲讲EF Core中的原始查询,目前在项目中对于简单的查询直接通过EF就可以解决,但是涉及到多表查询时为了一步到位就采用了原始查询的方式进行.下面我们一起来看看. EntityFram ...

  4. Java中的多态

    1.多态:具有表现多种形态的能力的特征 父类: public abstract class Animal {public abstract void Say();} 子类: public class ...

  5. Android raw to bmp

    Android raw 格式转 bmp 图像 raw 保存的为裸数据,转换时都需要把它转成RGBA 的方式来显示.其中: 8位RAW: 四位RGBA 来表示一位灰度; 24位RAW: 三位RGB相同, ...

  6. C# 工厂模式+虚方法(接口、抽象方法)实现多态

    面向对象语言的三大特征之一就是多态,听起来多态比较抽象,简而言之就是同一行为针对不同对象得到不同的结果,同一对象,在不同的环境下得到不同的状态. 实例说明: 业务需求:实现一个打开文件的控制台程序的d ...

  7. C#非常重要基础之多态

    前几天看了一位同志的博客,写的是关于他自己去支付宝面试的经历.过程大体是这样的:问答的时候,前面部分,作者都应答如流,说起自己经验如何之丰富,最后面试官问了作者一个问题:请简述多态的概念和作用.结果这 ...

  8. C++多态详解

    多态是面向对象的程序设计的关键技术.多态:调用同一个函数名,可以根据需要但实现不同的功能.多态体现在两个方面,我们以前学过的编译时的多态性(函数重载)和现在我们这一章将要学习的运行时的多态性(虚函数) ...

  9. 【那些年关于java多态应用】

    1.多态:具有表现多种形态的能力的特征 父类: public abstract class Animal { public abstract void Say();} 子类: public class ...

随机推荐

  1. iOS-工厂模式

    概述 在前面两章中,分别介绍了简单工厂模式和工厂方法模式,我们知道简单工厂模式的优点是去除了客户端与具体产品的依赖,缺点是违反了“开放-关闭原则”:工厂方法模式克服了简单工厂模式的缺点,将产品的创建工 ...

  2. VMware Workstation cannot connect to the virtual machine 解决方案

    今天 打开虚拟机 忽然遇到这个问题: VMware Workstation cannot connect to the virtual machine. Make sure you have righ ...

  3. 使用动态类型dynamic让你的省了很多临时类

    客户端与服务端的数据交互使用的数据格式是json格式,为了使客户端与服务端有类对应关系,进行序列化,所以总要定义一些类,使用动态类型dynamic可以不必要定义那么多类. 测试代码: using Sy ...

  4. inoic start projectname sidemenu报错 - Error: Cannot find module 'lodash._baseslice'

    inoic start projectname sidemenu报错 - Error: Cannot find module 'lodash._baseslice' 在公司的电脑上出现过这个错误,后来 ...

  5. Java EE开发平台随手记6——Mybatis扩展4

    这篇博客中来说一下对Mybatis动态代理接口方式的扩展,对于Mybatis动态代理接口不熟悉的朋友,可以参考前一篇博客,或者研读Mybatis源码. 扩展11:动态代理接口扩展 我们知道,真正在My ...

  6. Cocos2d-x 3.2 学习笔记(四)学习打包Android平台APK!

    从cocos2dx 3.2项目打包成apk安卓应用文件,搭建安卓环境的步骤有点繁琐,但搭建一次之后,以后就会非常快捷! (涉及到3.1.1版本的,请自动对应3.2版本,3.x版本的环境搭建都是一样的) ...

  7. 邻接表有向图(一)之 C语言详解

    本章介绍邻接表有向图.在"图的理论基础"中已经对图进行了理论介绍,这里就不再对图的概念进行重复说明了.和以往一样,本文会先给出C语言的实现:后续再分别给出C++和Java版本的实现 ...

  8. [转载]UML类图总结

    前言 类图和序列图是UML中最常用的两种Diagram.我将做详细的总结.在许多书中,或者网站中,在介绍一个系统的子系统的设计时,很多时候,都是给出简单的类图来简述构成子系统的类之间的关系.这足以说明 ...

  9. Arctext.js - 基于 CSS3 & jQuery 的文本弯曲效果

    Arctext.js 是基于 Lettering.js 的文本旋转插件,根据设置的旋转半径准确计算每个字母的旋转弧度并均匀分布.虽然 CSS3 也能够实现字符旋转效果,但是要让安排每个字母都沿着弯曲路 ...

  10. [software development] 需求分析checklist

    [software development] 需求分析checklist // */ // ]]>   [software development] 需求分析checklist Table of ...