C++中的虚函数(virtual function)

Posted by admin On 8月 - 4 - 2022

那现在就把main()处的代码改一改。

下面来看一段简单的代码classA现在我们拥有一个通用的CallVirtualFun方法。

这两个函数不仅名字相同,而且参数个数相同(均为0),但功能不同,函数体是不同的。

这种技术可以让父类的指针有多种形态,这是一种泛型技术。

>文章来源:https://www.cnblogs.com/Steven->HU/p/14486011.html?utm_source=tuicool&utm_medium=referral**最后,特别推荐一个分享C/C++和算法的优质内容,学习交流,技术探讨,面试指导,简历修改…还有超多源码素材等学习资料,零基础的视频等着你!****还没关注的小伙伴,可以长按关注一下:**,1\\.从存储空间角度,虚函数对应一个指向vtable虚函数表的指针,这大家都知道,可是这个指向vtable的指针其实是存储在对象的内存空间的。

在编译时,一个类的虚函数表就确定了,这也是为什么它放在了只读数据段中1.编译器将虚函数表的指针放在类的实例对象的内存空间中,该对象调用类的虚函数时,通过指针找到虚函数表,根据虚函数表中存放的虚函数的地址找到对应的虚函数2.如果派生类没有重写基类的虚函数A,则派生类的虚函数表中保存的是基类虚函数A的地址,也就是说基类和派生类的虚函数A的地址是一样的3.如果派生类重写了某个的虚函数B,则派生类的虚函数表中保存的是重写后的虚函数B的地址,也就是说虚函数B有两个版本,分别存放在基类和派生类的虚函数中4.如果派生类重新定义了新的虚函数C,派生类的虚函数表保存新的虚函数C的地址**多态起手式以及内存分布**假设有一个基类ClassA,一个继承了该基类的派生类ClassB,并且基类中有虚函数,派生类实现了基类的虚函数。

这种技术可以让父类的指针有多种形态,这是一种泛型技术。

通过基类指针做虚函数调用时(也就是做多态调用时),编译器静态地插入取得这个VPTR,并在VTABLE表中查找函数地址的代码,这样就能调用正确的函数使晚捆绑发生。

多态指同一个方法根据其所属的不同对象可以有不同的行为(根据自己理解,不知这么说是否严谨。

由多态方式调用的时候动态绑定。

根据这些信息,我们可以推理出很多有用的结论:·拥有虚函数的类会有一个虚表,而且这个虚表存放在类定义模块的数据段中。

**本文针对C++里的虚函数,虚继承表现和原理进行一些简单分析,有不对的地方请指出。

现在我就把我脑子里的虚函数聊聊,各位大见笑了:在我们现实生活中有很多词,比如开这个词,现在有一辆汽车和一辆自行车在你面前,我对你说,请把这个车开起来!当我指向汽车时,你就会加油门,然后转方向盘,汽车开起来。

当涉及到多态性的时候,采用了虚函数和动态绑定,此时的调用就不会在编译时候确定而是在运行时确定。

如果我指向自行车时,你就会两脚一登,把自行车开起来。

__假设我们有这样的一个类:_classBase,**首先:强调一个概念**定义一个函数为虚函数,不代表函数为不被实现的函数。

因此,在性能和其它特性的选择方面,需要开发人员根据实际情况进行进行权衡和取舍,如果性能检验确认性能瓶颈不是虚函数没有利用内联的优势引起,可以不必考虑虚函数对性能的影响。

**注:对象不包含虚函数表,只有虚指针,类才包含虚函数表,派生类会生成一个兼容基类的虚函数表。

Add your comment