• 对虚函数、虚表的认识


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

    关键字: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);

  • 相关阅读:
    vsftp
    数据类型
    第三篇:表相关操作
    第二篇:库相关操作
    第一篇: 初识数据库
    五 python并发编程之IO模型
    四 python并发编程之协程
    Python GIL
    三 python并发编程之多线程-重点
    三 python并发编程之多线程-理论
  • 原文地址:https://www.cnblogs.com/single-dont/p/11172595.html
Copyright © 2020-2023  润新知