注意:父类构造函数,虚表指针修改为指向父类的虚表,所以在父类构造函数内调用虚函数,调用的是父类的虚函数
子类构造函数,虚表指针修改为指向子类的虚表
注意:析构函数执行会首先设置虚表指针为自身虚表,再调用自身的析构函数。防止父类析构函数内调用子类对象的虚函数。
类有派生与继承关系,需要声明析构函数为虚函数。若析构函数不是虚函数时,当使用父类指针指向堆中的子类对象,并使用delete释放对象空间时,编译器会按照指针类型调用父类的析构函数,从而引发错误
构造函数
1 pop ecx ;this指针出栈 2 mov [ebp+this], ecx ;保存this指针 3 mov ecx, [ebp+this] 4 call j_??0Base@@QAE@XZ ;调用基类构造函数Base::Base(void) 5 mov eax, [ebp+this] ;eax=this指针 6 mov dword ptr [eax], offset ??_7Derive@@6B@ ;初始化虚表指针为const Derive::`vftable‘
析构函数
1 pop ecx ;this指针出栈 2 mov [ebp+this], ecx ;=>保存this指针 3 mov eax, [ebp+this] 4 mov dword ptr [eax], offset ??_7Derive@@6B@ ;重置虚表指针为const Derive::`vftable‘ 5 mov esi, esp 6 push offset aDerive ; 7 call ds:__imp__printf 8 add esp, 4 9 cmp esi, esp 10 call j___RTC_CheckEsp 11 mov ecx, [ebp+this] ;ecx传参this指针 12 call j_??1Base@@QAE@XZ ;调用基类析构函数 Base::~Base(void)
参考文献:
《C++反汇编与逆向分析技术揭秘》
《汇编语言程序设计》
原文:https://www.cnblogs.com/mysky007/p/12650398.html