zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    题解 [APIO2014]连珠线
    题解 [ZJOI2019]语言
    题解 Hero meet devil
    题解 [BJOI2019]奥术神杖
    题解「2017 山东一轮集训 Day1 / SDWC2018 Day1」Set
    题解 Sue的小球/名次排序问题/方块消除/奥运物流
    题解 「一本通 5.4 练习 1」涂抹果酱
    Mybatis的类型转换
    面试题:微服务熔断降级限流
    面试题:微服务网关
  • 原文地址:https://www.cnblogs.com/hanxinle/p/5847554.html
Copyright © 2011-2022 走看看