首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++深度辨析(一) this指针与虚表

2012-11-19 
C++深度剖析(一) this指针与虚表我们知道,在C的非静态成员函数中,有一个隐含的参数,即this指针,利用它,我

C++深度剖析(一) this指针与虚表

我们知道,在C++的非静态成员函数中,有一个隐含的参数,即this指针,利用它,我们可以访问相应对象的数据成员,那么究竟this指针是如何作用的呢?下面先来看一个例子。有下面的一个简单的类:

为了更好的理解它,我们来看一个比较奇怪的例子。

假设我们有这样的一个类:

typedef void (*FUNC)();int main(int argc, char** argv) {    A a(2);    FUNC* fs = *(FUNC**)&a;    cout << fs<< endl;    fs[0]();    fs[1]();    return 0;}

在这个实例里面,fs实际上就指向了虚表的首地址,我们可以把它想象成一个数组,这样就可以对虚函数进行调用了,而且这一方法还可以绕过它对访问修饰的限制,即使是私有虚函数,我们也可以照调用不误。

关于虚表就说到这里,下面还是回到对通过指针调用的函数是虚函数的讨论中来。这在种情况下,编绎器插入的代码完成的功能大概如下:还是首先将对象的首地址放到ECX寄存器中,然后插入函数调用的代码,只不过这里不再是一个简单的函数首地址完事,它会插入一些代码通过前面提到的虚表机制找寻真正要调用的函数的入口地址。

在上一个例子中,如果我们调用fs[2]()函数会怎么样呢?因为我们是直接通过虚表调用的成员函数,所以它没有事先将对象的首地址放到ECX寄存器中,而该成员函数是会通过EXC寄存器中存储的原先的值去访问数据成员d的,那么它输出的就将是一个没有意义的随机值罢了。

通过以上对this指针以及虚表的讨论,回想C++中关于成员函数指针的使用,我们就可以理解它到底和普通的函数指针有何不同了,一切都是this指针的缘故,通过成员指针调用函数会事先将对象的首地址放到ECX寄存器中,这也就是它们的根本区别所在。

参考文献

浅析C++中的this指针

C++虚函数表解析


热点排行