抽象类反汇编
#include<stdio.h>classAbstractBase{public:AbstractBase(){printf("AbstractBase()");}virtualvoidshow()=0;// 定义纯虚函数};classVirtualChild:publicAbstractBase{// 定义继承抽象类的子类public:virtualvoidshow(){// 实现纯虚函数printf("抽象类分析\n");}};intmain(intargc,char*argv[]){VirtualChild obj;obj.show();return0;}对于纯虚函数,我们来看看编译器是如何实现的。先反汇编main:
正常调用对象的构造函数,我们反汇编其构造函数:
可以看到先调用了抽象类的构造函数,我们看看抽象类的构造函数中是如何设置虚表的:
查看父类虚表:
虚表中只有一项,我们反汇编这个函数:
在抽象类AbstractBase的虚表信息中,因为纯虚函数没有实现代码,所以没有首地址。编译器为了防止误调用纯虚函数,将虚表中保存的纯虚函数的首地址项替换成函数__purecall,用于结束程序。当抽象类中定义了多个纯虚函数时,虚表中将保存相同的函数指针。