精华内容
下载资源
问答
  • 虚表 千次阅读
    2019-10-24 16:20:37

    虚表(虚函数表)

            C++中,一个类存在虚函数,那么编译器就会为这个类生成一个虚函数表,在虚函数表里存放的是这个类所有虚函数的地址(虚表从属于类)。编译器会为包含虚函数的类加上一个成员变量,该成员变量是一个指向虚函数表的指针,因此虚表指针是一个成员属性,也就是说,如果一个类含有虚表,那么类的每个对象都含有虚表指针。当生成类对象的时候,编译器会自动的将类对象的前四个字节设置为虚表的地址(不一定哦,但是大部分是),而这四个字节就可以看作是一个指向虚函数表的指针。

            虚函数表属于类,类的所有对象共享这个类的虚函数表
            虚函数表存储在只读数据段(.rodata),也就是说虚函数表在编译阶段就已经形成了,虚函数表指针是在构造函数中赋值的。
    注意
            1) 派生类对象有两部分组成,一部分是从父类中继承到的成员(包括虚表指针),另一部分就是子类自己的成员
            3) 虚函数表本质是一个存放虚函数指针的指针数组,这个数组最后面放了一个nullptr
            4) 派生类的虚表的生成:a.先将基类中的虚表内容拷贝一份到派生类虚表中 b.如果派生类重写了基类中的某个虚函数,用派生类自己的虚函数覆盖虚表中的基类的虚函数 c.派生类自己新增的虚函数按其在派生类中的声明次序依次增加到派生类虚表的最后
            5) 虚表存的是虚函数指针,不是虚函数,虚函数和普通函数一样都是存在于代码段中的,只是它的指针又存到了虚表中。对象中存的不是虚表,存的是虚表的指针。虚表也是存在于数据段的。
            6) 满足多态的的函数调用是在运行时确定的(从对象中找到函数地址),而不满足多态的函数调用是编译时确定好的
            7) 多继承派生类的未重写的虚函数放在第一个继承基类部分的虚函数表

    动态绑定和静态绑定

            1) 静态绑定又称为前期绑定(早绑定),在程序编译期间确定了程序的行为,也称为静态多态,例如函数重载
            2) 动态绑定又称为后期绑定(晚绑定),是程序运行期间,根据具体拿到的类型确定程序的具体行为,调用具体的函数,也称为动态多态

    单继承的无重写虚函数

    那么派生类将会把自己的虚函数加入到基类虚表中,按照声明次序依次加入

    单继承的有重写虚函数

    派生类将其重写的函数地址覆盖到虚表指定的位置上

    无重写的单继承的虚拟继承

    基类打印自己得虚函数,派生类只打印自己的,并不会打印基类的。
    派生类对象结构为派生类虚函数指针、虚基类指针、派生类成员变量、基类虚函数指针、基类的成员变量
    在这里插入图片描述
    这里我们看到了虚基类指针其实就是指向当前位置与基类的偏移量

    // 如果你想打印基类的方法
    #include<iostream>
    using namespace std;
    class Base
    {
    public:
    	Base()
    	{
    		b = 10;
    	}
    	virtual void fun0()
    	{
    		cout << "Base::fun0()" << endl;
    	}
    	virtual void fun1()
    	{
    		cout << "Base::fun1()" << endl;
    	}
    	virtual void fun2()
    	{
    		cout << "Base::fun2()" << endl;
    	}
    	int b;
    };
    class Derived :virtual public Base
    {
    public:
    	Derived()
    	{
    		d = 20;
    	}
    	virtual void fun3()
    	{
    		cout << "Derived::fun3()" << endl;
    	}
    	virtual void fun4()
    	{
    		cout << "Derived::fun4()" << endl;
    	}
    	virtual void fun5()
    	{
    		cout << "Derived::fun5()" << endl;
    	}
    	int d;
    };
    typedef void(*vpf)();
    void Printvpf()
    {
    	Base b;
    	Derived d;
    	//Base* p = &d;
    	cout << "Base::vpf" << endl;
    	vpf* n = (vpf*)*(int *)(&b);
    	while (*n)
    	{
    		(*n)();
    		n++;
    	}
    	cout << "Derived::vpf" << endl;
    	vpf* pn = (vpf*)*(int *)(&d);
    	while (*pn)
    	{
    		(*pn)();
    		pn++;
    	}
    	cout << "Derived::Base vpf" << endl;
    	vpf* pp = (vpf*)(*(int *)((char *)(&d) + 12));
    	while (*pp)
    	{
    		(*pp)();
    		pp++;
    	}
    	cout << sizeof(Base) << endl;
    	cout << *((int *)(*(int*)((int*)(&d) + 1)) + 1) << endl;
    	cout << sizeof(Derived) << endl;
    }
    int main()
    {
    	Printvpf();
    	system("pause");
    	return 0;
    }
    
    

    单继承的虚拟继承的有重写的虚表

    基类只打印自己的,派生类将重写的不打印,只打印自己的
    基类大小不变,派生类的大小和无重写几乎一样,不过多了一个用于区分对象的0,这个0加进了派生类数据成员和指向基类虚表的指针之间
    在这里插入图片描述

    #include<iostream>
    using namespace std;
    class Base
    {
    public:
    	Base()
    	{
    		b = 10;
    	}
    	virtual void fun0()
    	{
    		cout << "Base::fun0()" << endl;
    	}
    	virtual void fun1()
    	{
    		cout << "Base::fun1()" << endl;
    	}
    	virtual void fun2()
    	{
    		cout << "Base::fun2()" << endl;
    	}
    	int b;
    };
    class Derived :virtual public Base
    {
    public:
    	Derived()
    	{
    		d = 20;
    	}
    	virtual void fun0()
    	{
    		cout << "Derived::fun0()" << endl;
    	}
    	virtual void fun1()
    	{
    		cout << "Derived::fun1()" << endl;
    	}
    	virtual void fun5()
    	{
    		cout << "Derived::fun5()" << endl;
    	}
    	int d;
    };
    typedef void(*vpf)();
    void Printvpf()
    {
    	Base b;
    	Derived d;
    	//Base* p = &d;
    	cout << "Base::vpf" << endl;
    	vpf* n = (vpf*)*(int *)(&b);
    	while (*n)
    	{
    		(*n)();
    		n++;
    	}
    	cout << "Derived::vpf" << endl;
    	vpf* pn = (vpf*)*(int *)(&d);
    	while (*pn)
    	{
    		(*pn)();
    		pn++;
    	}
    	cout << sizeof(Base) << endl;
    	cout << sizeof(Derived) << endl;
    }
    int main()
    {
    	Printvpf();
    	system("pause");
    	return 0;
    }
    
    更多相关内容
  • 易语言彗星虚表操作类_1.3模块源码
  • 用c++类的实例解析虚函数表,查看虚表的地址,利用虚函数表中的地址调用虚函数实现C++中的多态特性, 此例是解析虚函数中简单易于理解的示例,重要的地方具有详细的注释。亲测可用,若有不清除的地方,可以留言,...
  • 案例:十几万行 随便移动 不卡顿 不闪屏 (顶部表头会有微弱的暂未解决) 注:源码改进自论坛大神源码,具体谁我忘了 来吧 下载吧 已修复调试就卡死的(易语言 bug 他跟识别dll命令重复 跟命令重复没选择)
  • 易语言超级列表框模拟虚表加载数据源码
  • 相比于1.6版,修复部分BUG,支持多, 新增单条记录刷新(无闪烁)! 本模块改彗星模块源码制作而成
  • 易语言虚表填充数据源码
  • 易语言 彗星虚表操作

    2018-05-23 10:17:35
    易语言 彗星虚表操作,新人不懂虚表之类的可以参考,例子很详细。
  • 基于邓总之前的基础上增加了 设置虚表位置及大小的功能, 修复了黑月编译产生的BUG(无法显示内容),修复了绑定记录集不显示内容
  • 易语言超级列表框虚表模块源码,超级列表框虚表模块,超级列表框_删除勾选,超级列表框_全部勾选,超级列表框_构造数据,超级列表框_显示数据,超级列表框_置标题行,超级列表框_扩展样式,超级列表框_虚表初始化_文本型,...
  • 易语言virlist.fne支持库中文名为易语言虚表列表支持库,本易语言支持库实现了对虚表列表框组件的支持。 易语言virlist.fne支持库为一般支持库,需要易系统3.0版本的支持,需要系统核心支持库3.0版本的支持,提供了1...
  • 彗星虚表操作模块1.3-百万数据毫秒级加入超级列表框。基于邓学彬之前的基础上增加了 设置虚表位置及大小的功能,。修复了黑月编译产生的BUG(无法显示内容),修复了绑定记录集不显示内容。资源作者:。山内归屌。资源...
  • 自绘虚表,模块请自行到精易论坛搜索下载
  • 易语言彗星虚表操作类_1.3模块源码,彗星虚表操作类_1.3模块,父窗口消息处理,列表框消息处理,On_MouscEveal,On_LvnGetdispinfo,指针到列表框项目,读绑定数据库,是否已创建,取窗口句柄,创建,高度,宽度,左边,顶边,事件_...
  • 易语言超级列表框虚表化源码。@易语言源码分享站。
  • 易语言源码易语言虚表填充数据源码.rar 易语言源码易语言虚表填充数据源码.rar 易语言源码易语言虚表填充数据源码.rar 易语言源码易语言虚表填充数据源码.rar 易语言源码易语言虚表填充数据源码.rar 易语言源码...
  • 彗星虚表操作模块1.3-百万数据毫秒级加入超级列表框 基于邓学彬之前的基础上增加了 设置虚表位置及大小的功能, 修复了黑月编译产生的BUG(无法显示内容),修复了绑定记录集不显示内容 山内归屌
  •  我们说的虚表其实有很多种叫法:  · virtual method table(VMT)  · virtual function table(vftable)  · virtual call table  · dispatch table  · vtable  这些都是虚表的意思。虚表是一种...
  • 易语言超级列表框虚表模块源码例程程序结合易语言扩展界面支持库,实现超级列表框虚表功能。 三叶自学编程网
  • 易语言超级列表框虚表模块源码
  • 虚表实战读入MYSQL例子
  • 易语言超列_模拟虚表源码与例程(易语言千万级别数据库导入例子)。@熬夜。
  • 个人自用。 操作系统支持: Windows
  • C++ 中的函数的作用主要是实现了多态的机制。关于多态,简而言之就是用父类型别的指针指向其子类的实例,然后通过父类的指针调用实际子类的成员函数。这种技 术可以让父类的指针有“多种形态”,这是一种泛型技术...
  • 易语言源码易语言超级列表框模拟虚表加载数据源码.rar 易语言源码易语言超级列表框模拟虚表加载数据源码.rar 易语言源码易语言超级列表框模拟虚表加载数据源码.rar 易语言源码易语言超级列表框模拟虚表加载数据...
  • 易语言模块源码彗星虚表操作类 下面是个使用示例: 经测试,只要两秒左右,超级列表框不卡。 操作提示:画一个按钮即可。粘贴以下代码: .版本 2 .支持库 commobj .程序集 窗口程序集_启动窗口 ....
  • MFC ListCtrl 虚表实现

    2019-02-19 23:00:38
    Virtual List的实现和使用例子; Virtual List 和List Ctrl的性能比较
  • 资源介绍:彗星虚表操作模块1.3-百万数据毫秒级加入超级列表框基于邓学彬之前的基础上增加了 设置虚表位置及大小的功能,修复了黑月编译产生的BUG(无法显示内容),修复了绑定记录集不显示内容资源作者:山内归屌资源...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 193,640
精华内容 77,456
关键字:

虚表