构造函数中使用memset会剖坏虚表指针
1.通过对象调用时,编译器直接生成调用的地址;
2.通过指针或者引用调用时,在运行期通过虚表指针查询调用的地址;
#include <iostream> using namespace std; class A { public: A() { memset(this,0,sizeof(*this)); } virtual void fun() { cout << "fun" << endl; } }; class B:public A { public: B() { memset(this, 0, sizeof(*this)); } virtual void fun() { cout << "B::fun()" << endl; } }; int main() { //1.通过对象调用时,编译器直接生成调用的地址; //2.通过指针或者引用调用时,在运行期通过虚表指针查询调用的地址; A a; a.fun(); B b; b.fun(); A& aa = a; aa.fun(); A* pa = &a; pa->fun(); system("pause"); }
反汇编:
《完》