博客虚函数实现过程3 时提到过虚基类,这里呢,我们来详细讲述一下:
当我们在虚函数的声明结尾处添加“=0”,这种虚函数就被称为纯虚函数。
它好似一个没有实现只有声明的函数,它的存在就是为了让类具有抽象类的功能,让继承自抽象类的子类都有虚表和虚表指针。

使用过程中,利用抽象类指针可以更好地完成多态工作。
如下分析:

大家想一想,只有声明却没有实现的函数,它的虚表指针指向的函数那是什么玩意?它还是指向一个函数指针吗?这个函数指针指向的地方是哪里呢?会不会是空?里面难不成放了一个null?还是放了一个报错?或者直接指向其它函数?等等疑问,如何解决呢?我们直接通过底层汇编代码来分析就可以看出来喽。


它的虚表指针指向了425068(从地址401830所看出来的),接下来我们探索425068地址去看看那里有个啥呢?

哇哦,原来是一个 指针,指向的地方是401E90,它是一个函数_purecall,它用于结束程序,并发出错误编码信息0x19。

如果当我们定义了多个纯虚函数时,那么虚表里面存放的是函数指针内容是不是一样的呢?

两个纯虚函数都是函数_purecall,所以一切都清晰喽。

总结:

由于纯虚函数没有实现代码,因此没有首地址。编译器为了防止误调用纯虚函数,将虚表中保存的纯虚函数的首地址换成函数_purecall,它用于结束程序,并发出错误编码信息0x19。
根据这一特性,在分析过程中,一旦在虚表中发现函数地址为_purecall函数的地址时,我们就可以高度怀疑此虚表对应的类是一个虚基类。

虚函数系列:
详解虚函数的实现过程之初探虚表(1)
详解虚函数的实现过程之单继承(2)
详解虚函数的实现过程之多重继承(3)
详解虚函数的实现过程之虚基类(4)
详解虚函数的实现过程之菱形继承(5)

详解虚函数的实现过程之虚基类(4)相关推荐

  1. java基类能调用虚函数_如果我要重写基类的虚函数,可以调用它吗?

    MYYA 是,class Bar : public Foo{    ...    void printStuff()    {        Foo::printStuff();    }};它与su ...

  2. 详解虚函数的实现过程之菱形继承(5)

    大家看到标题,会不会菱形继承的虚表会不会是重复的呢?祖父类的虚表会不会在子类会不会是两份相同呢?那么我们一起来探索一下吧,冲冲冲!! 首先我们来分析一下: 它一共定义了四个类,分别为CFurnitur ...

  3. 详解虚函数的实现过程之多重继承(3)

    下面来一起探索一下多重继承时,有虚函数会怎么继承呢? 这里大家猜一下,SofaBed会占多少个字节呢? 首先我们是不是得猜一下它有几个虚表指针? 4* 4(4个int数据)+2*4(两个虚表指针)=2 ...

  4. 详解虚函数的实现过程之单继承(2)

    从汇编分析一下下面的多态模拟结构 利用 父类指针指向子类的特性,可以间接调用各子类中的虚函数. 虽然指针类型为父类,但由于虚表的排列顺序是按虚函数在类继承层次中首次声明的顺序依次排列的,因此,只要继承 ...

  5. 详解虚函数的实现过程之初探虚表(1)

    空对象它有一字节的大小,在没有任何成员变量但是却有虚函数的对象里,它的大小是四个字节,这是为什么呢? 因为含有虚函数的对象里,对象的起始地址往后四个字节其实是 一个指针,它指向了一个数组,这个数组的元 ...

  6. 静态联编,动态联编,类指针之间的关系,虚函数与多态性,纯虚函数,虚析构函数

    1.静态联编,是程序的匹配,连接在编译阶段实现,也称为早期匹配.重载函数使用静态联编. 2.动态联编是指程序联编推迟到运行时进行,所以又称为晚期联编.switch语句和if语句是动态联编的例子. #i ...

  7. 虚函数必须定义(纯虚函数除外)

    1. 虚函数的声明和定义 具体关于虚函数的知识不做多讲,我在定义一个抽象类时,忘了将一个虚函数声明为 纯虚函数,又没有对其定义, 导致编译报错时报错如下: undefined reference to ...

  8. C++虚函数的实现方式(虚表+虚指针)

    虚函数表实现原理 虚函数的实现是由两个部分组成的,虚函数指针与虚函数表. 用virtual关键字申明的函数叫做虚函数,虚函数肯定是类的成员函数. 存在虚函数的类都有一个一维的虚函数表叫做虚表.每一个类 ...

  9. python中可变参数*args传入函数时的存储方式为_python 中文读法详解Python函数可变参数定义及其参数传递方式...

    Python函数可变参数定义及其参数传递方式详解 python中 函数不定参数的定义形式如下 1. func(*args) 传入的参数为以元组形式存在args中,如: def func(*args): ...

最新文章

  1. Prime Path(bfs)广度优先搜索
  2. OpenGL基础知识
  3. nginx配置文件及工作原理详解
  4. Dubbo错误排查:com.alibaba.dubbo.rpc.RpcException: Invoke remote method timeout
  5. Spring Security 基本介绍,初窥路径
  6. 10进制转换16进制补足0_信息技术教师资格必考内容——进制换算(一)
  7. Nginx服务器之负载均衡策略(6种)
  8. javaScript几种设计模式之一——单体模式
  9. (2)vue.js介绍
  10. qt android webview,qt browser 加载一个webview过程
  11. c#与获得文件夹路径,站点目录
  12. android 饿了么地图,饿了么送餐位置地图定位代码
  13. pytorch入门——线性回归
  14. Code Snippet 插件 使用——代码高亮
  15. 一步步学Qt,第九天-QSTL与STL-Qvector,vector
  16. java 子类型_Java – 基类和子类中的equals方法
  17. hprose-php教程,PHP RPC框架 hprose 上手玩玩
  18. QGIS制作好看地形图
  19. 美团Android开发工程师岗位职能要求,薪资翻倍
  20. 大前端-HTML-标签

热门文章

  1. Python语言学习:利用python语言实现调用内部命令(python调用Shell脚本)—命令提示符cmd的几种方法
  2. ML之FE:结合Kaggle比赛的某一案例细究特征工程(Feature Engineering)思路框架
  3. Py之GUI之PyQt:PyQt5的简介、入门、安装(QtCreator和QtDesigner)图文教程之详细攻略
  4. Python之tkinter:动态演示调用python库的tkinter带你进入GUI世界(计算器简单功能)
  5. page分页问题,根据页码获取对应页面的数据,接口调用
  6. 洛谷P2670扫雷游戏题解
  7. 十年之后再看“面向对象”
  8. linux下oracle数据库服务和监听的启动停止
  9. Android+NDK+OpenGLES开发环境配置
  10. BZOJ2490 Zombie’s Treasure Chest