程序退出或者组件析构过程中常发生一类“pure virtual method called”导致的core,前几栈帧如下:
这里对该问题发生的原理做一个剖析并给出一个可复现该问题的简单demo
前置知识
一、虚函数表
虚函数表的概念在很多如《c++ primer plus》等权威书籍中有详细阐述,这里简单回顾下虚函数表的概念
虚函数表用于支持运行时多态,在继承关系中,父类声明的函数在子类的中可以用同名函数重写,这类函数按照静态调用的规则,根据指针、引用、原始对象的类型决定调用父类函数还是子类函数。若父类函数用virtual声明,那么这个函数在其继承链的所有子类、孙子类等中均为虚函数,具备运行时多态度,在使用指针、引用调用时,根据实际对象的类型决定调用父类函数还是子类函数。为了实现这种运行时多态,编译器采用的方法大多是使用虚函数表。父类和子类各自保存各自的一个虚函数表,虚函数表中保存若干函数指针,指向所有虚函数在本类中的实现,从而定位到某个虚函数。
二、纯虚函数和ABC(abstract basic class)类
若父类虚函数用=0标记,如 virtual void func() = 0; 那么这种父类被称为“ABC类”,不能为该类实例化对象。c++标准允许父类不为这种函数提供定义