技术笔记
本博客记录踩坑脱坑、早年知识归纳. 新博客常常更新: https://hanxinle.github.io

导航

 

今天翻看陈皓大大的博客,直接找关于C++的东东,看到了虚函数表的内容,找一些能看得懂的地方记下笔记。

 

0 引子 

类中存在虚函数,就会存在虚函数表,在vs2015的实现中,它存在于类的头部。

假设有如下类:

class Base {
     public:
            virtual void f() { cout << "Base::f" << endl; }
            virtual void g() { cout << "Base::g" << endl; }
            virtual void h() { cout << "Base::h" << endl; }
 
};

虚函数指针和虚函数指针示意图(图片来源于参考资料[1])

1  查看

 

 typedef void(*Fun)(void);
 
            Base b;
            Fun pFun = NULL;
            cout << "虚函数表地址:" << (int*)(&b) << endl;
            cout << "虚函数表 — 第一个函数地址:" << (int*)*(int*)(&b) << endl;
 
            pFun = (Fun)*((int*)*(int*)(&b));
            pFun();

 

讲解代码:

 

强行把&b转成int *,取得虚函数表的地址,然后,再次取址就可以得到第一个虚函数的地址了,也就是Base::f(),这在上面的程序中得到了验证(把int* 强制转成了函数指针)。通过这个示例,我们就可以知道如果要调用Base::g()Base::h(),其代码如下:

 

 

               (Fun)*((int*)*(int*)(&b)+0);  // Base::f()

 

            (Fun)*((int*)*(int*)(&b)+1);  // Base::g()

 

            (Fun)*((int*)*(int*)(&b)+2);  // Base::h()

 

 

2 为什么写这篇文章

(1) 了解虚函数表的存在,作为接下来学习的知识储备;

(2)  记住陈皓大大获取虚函数表的时候多次强制转换指针;

(3)  另外这里的讨论有错误之处,http://bbs.csdn.net/topics/320008423 ,自己要看下靠谱书籍纠正这些错误,我暂时相信陈皓大大的讲解。

 

 

 

 

 

 

 

 

参考:

[1]  C++虚函数表解析.陈皓.http://blog.csdn.net/haoel/article/details/1948051

 

posted on 2016-09-06 23:09  九品加  阅读(242)  评论(0编辑  收藏  举报