class classA
{
public:
classA()
{
memset(this , 0 , sizeof(*this));
}
virtual ~classA()
{
}
virtual void func()
{
cout<<"func\n";
}
};
int main(void)
{
classA oa;
classA * pa0 = &oa;
oa.func(); // 1
pa0->func(); // 2
return 0;
}
第一句的调用是没有问题,但是第二句就会出问题。
c++的类内存模式,如若类中会含有虚函数,则会在类空间中添加一个vptr指针,在运行构造函数时会给vprt赋初值,但是
memset(this , 0 , sizeof(*this));
这句会使得vptr内容重新更改为0。
那第一句能调用成功,说明两者的调用的机制不一样,这也就是为什么,要用指针或者引用实现运行时多态。
pa0->func();
会被编译器转化为:
(*pa0->vptr[1])(pa0);
其中1是虚拟函数表的索引值,不用管。
第二个pa0代表this指针。
因为此时,vptr已经被更改,所以不对了,结果出core。
而
oa.func();
会被转化为:
func_XXX(&oa);
和普通的nonstatic 成员函数一样处理。