先看一下一个简单的函数:
X foobar()
{
X xx;
X *px = new X;
xx.foo();
delete px;
return x;
}
编译器做出的一些转换:
void foobar(X& _result)
{
//按原来的程序需要构造两个临时变量
//所以这里使用引用的方式来返回结果
//调用构造函数
_result.X::X();
//申请内存(其实就是operator new(size_t size))
px = _new(sizeof(X));
//如果申请内存成功就调用构造函数
if( px != 0)
px->X::X();
//这里就是成员函数的形式的转换,成员函数其实
//就是一个一般的函数,然后把this指针传入进去
//下面的foo 就是 foo(X* this);
foo(&_result);
//虚函数的基本调用方式,也就是通过vptr来调用
//vptr指向vtbl,然后直接用->符号即可访问vtbl
//然后下标2则可以访问到一个函数指针,所以调用
//就是这样(*xxx)(px) xxx就是取到的指针
//px就是this指针
(*px->vtbl[2])(px);
//同上,这是析构函数的多态使用,也需要
//检测指针不为空,因为c++提供一个保证
//就是对NULL进行delete不会出错
if( px != 0)
{
(*px->vtbl[1])(px);
_delete(px);
}
return;
}