码迷,mamicode.com
首页 > 编程语言 > 详细

C++ 知道虚函数表的存在

时间:2016-09-07 01:30:41      阅读:179      评论:0      收藏:0      [点我收藏+]

标签:

今天翻看陈皓大大的博客,直接找关于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

 

C++ 知道虚函数表的存在

标签:

原文地址:http://www.cnblogs.com/hanxinle/p/5847554.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!