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);

  • 相关阅读:
    mysql 导入导出
    spring3.1 profile 配置不同的环境
    <context:annotation-config />和 <context:component-scan
    NPM 使用介绍
    产品每生产一个消费一个
    通过Lock对象以及Condition对象实现多线程同步
    Spring定时任务的几种实现
    详解java定时任务
    设计模式-享元模式
    堆栈简析
  • 原文地址:https://www.cnblogs.com/single-dont/p/11172595.html
Copyright © 2011-2022 走看看