构造函数中使用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");
}
反汇编:
《完》
转载于:https://blog.51cto.com/lingdandan/1853826