虚函数的实现原理--c++虚函数表解析

来源:互联网 发布:1.5v单片机 温湿度测量 编辑:程序博客网 时间:2024/06/03 16:22

这里有一篇博客介绍的很详细:c++虚函数表解析

笔记与理解

  1. typedef void(*Fun)(void);// 这是将Fun定义为一个指向 void (void) 函数类型的函数指针
  2. &b;// 得到对象的地址(开头)
    • (int*)(&b);// 虚函数表的地址存在对象最前面的位置的指针中(保证最快的取到虚函数表), 取址,解释为指针
  3. (int*)* (int*)(&b);//对指针解引用,得到指向虚函数表(指针数组)的指针,函数表中存放着指向函数的指针。
  4. *(*(int**)(&b)+2);// 在函数数组中向后移动两位,取出其中的函数指针。
  5. pFun = (Fun)*((int*)*(int*)(&b));// 将函数指针的类型转换为Fun,并赋值给pFun。
  6. pFun();// 调用函数指针对应的函数。

听说配张图更好理解:

对象的首地址其实是指向指针的指针

之前觉得看不懂就是被博主的指针使用给绕进去了,因为存在强制类型转换,所以指针的类型并不重要,只是有点影响理解……

改写代码:

#include <iostream>class Base{    virtual void f() { std::cout << "Base::f" << std::endl; };    virtual void g() { std::cout << "Base::g" << std::endl; };    virtual void h() { std::cout << "Base::h" << std::endl; };};int main(){    typedef void(*Fun)();    Base b;    Fun pFun = NULL;    std::cout << "虚函数表地址:" << (int*)(&b) << " " << &b << std::endl;    std::cout << "虚函数表 — 第一个函数地址:" << *(int**)(&b) << std::endl;    std::cout << "虚函数表 — 第一个函数地址:" << (int*)*(int*)(&b) << std::endl;    // Invoke the first virtual function     pFun = (Fun)*(*(int**)(&b)+2);    pFun();// 函数指针可以直接调用,也可解引用后调用    (*((Fun)*(*(int**)(&b) + 2)))();// 解引用调用

其他地方想到再写~

纯属自己的想法,如有不对请指正

0 0