构造函数中使用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");
}


反汇编:

wKiom1feqO6SlwsCAAAmuXqImrM328.png

wKioL1feqO7A4CbaAAAVIOf7QY4488.png


《完》