zoukankan      html  css  js  c++  java
  • 对虚函数、虚表的认识

    虚函数:实现多态的机制,多态就是用父类型的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。让父类的指针有“多种形态”,一种泛型技术。

    关键字:virtual

    虚函数表:此表中,主要是一个类的虚函数的地址表,这张表解决了继承、覆盖的问题,保证其内容真实反映实际的情况。

    在C++标准规格说明书中说到,编译器需要保证虚函数表的指针在于对象实例中最前面的位置。(保证正确取到虚函数的偏移量)

    如何访问虚表?

    class Base
    {
    public:
        virtual void fun1()
        {
            cout << "Base:fun1()" << endl;
        }
        virtual void fun2()
        {
            cout << "Base:fun2()" << endl;
        }
        virtual void fun3()
        {
            cout << "Base:fun3()" << endl;
        }
    private:
        int x;
    };
    typedef void (*pFun)();
    
    void main()
    {
        Base b;
        cout <<hex<< *(int*)(&b) << endl;  //获得虚表指针
        pFun fun = (pFun)*(((int*)*(int*)(&b))+1); //获得虚表中函数的地址
        fun();
    }

    访问续表成员

    解释:根据前面知识,我们得到类实例所占空间的前四个字节空间为虚表地址。故__vfptr = *(int*)(&b)表示虚表的地址;然后在虚表的结构中,每个函数的地址也占用四个字节空间。

    Base:a() =*(((int*)(*(int*)(&b)))+0);

  • 相关阅读:
    链接收藏:bullet物理引擎不完全指南
    设计模式的六大原则
    链接错误 2038
    玄天宝录
    第二章 期中架构
    第一章 Linux基础
    13 代理与负载均衡基础
    12 LNMP搭建
    11 搭建博客
    10 Nginx模块介绍
  • 原文地址:https://www.cnblogs.com/single-dont/p/11172595.html
Copyright © 2011-2022 走看看