pure virtual method called 纯虚函数被调用原理分析

程序退出或者组件析构过程中常发生一类“pure virtual method called”导致的core,前几栈帧如下:

这里对该问题发生的原理做一个剖析并给出一个可复现该问题的简单demo

前置知识

一、虚函数表

虚函数表的概念在很多如《c++ primer plus》等权威书籍中有详细阐述,这里简单回顾下虚函数表的概念

虚函数表用于支持运行时多态,在继承关系中,父类声明的函数在子类的中可以用同名函数重写,这类函数按照静态调用的规则,根据指针、引用、原始对象的类型决定调用父类函数还是子类函数。若父类函数用virtual声明,那么这个函数在其继承链的所有子类、孙子类等中均为虚函数,具备运行时多态度,在使用指针、引用调用时,根据实际对象的类型决定调用父类函数还是子类函数。为了实现这种运行时多态,编译器采用的方法大多是使用虚函数表。父类和子类各自保存各自的一个虚函数表,虚函数表中保存若干函数指针,指向所有虚函数在本类中的实现,从而定位到某个虚函数。

二、纯虚函数和ABC(abstract basic class)类

若父类虚函数用=0标记,如 virtual void func() = 0; 那么这种父类被称为“ABC类”,不能为该类实例化对象。c++标准允许父类不为这种函数提供定义

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值