首页 > 代码库 > C++ 知道虚函数表的存在

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

今天翻看陈皓大大的博客,直接找关于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++ 知道虚函数表的存在